2011-04-07 20 views
5

Diğer büyük modüller (farklı istemciler) ile iletişim kuracak şekilde arabirimleri açığa çıkaran bir çekirdek modülün olması niyetindeyim.WCF - ortak yöntemleri paylaşan birden fazla sözleşme olduğunda en iyi uygulamayı aramak

void Method_A(); 
void Method_B(); 
void Method_X2(); 

müşterilerin diğer tip (modül "X2 görmesinde sakınca:

void Method_A(); 
void Method_B(); 
void Method_X1(); 

biri müşteri tipi (modül "X1") ve görmesinde sakınca: derseniz, yöntemlerin grup vardır ") ve Method_A ve Method_B'un tam olarak uygulanmasının gerektiğini bilmek ... o zaman servis (ler) mimarisini (hizmetler ve sözleşmeler anlamında) en iyi nasıl tasarlayabilirim?

Method_A ve Method_B'yi yalnızca bir kez uygulamak için bir şans var mı (farklı sözleşme uygulamalarında 2 kez değil)?

WCF kullanırken arabirim mirasından nasıl yararlanabilirim?

Her şey için şimdiden teşekkür ederiz ve daha net yapmam gerekiyorsa lütfen bana bildirin!

@marc_s ... Gerçekten ... bakış açınızı takdir ediyorum

cevap

3
Bir IServiceBase arayüzü ve sadece Method_A ve Method_B uygulayan ServiceBase sınıf var bu yüzden, bir arayüz tatmin yöntemlerini devralabilir

Sınıflar Daha sonra, benzersiz yöntemleri ayrı arayüzlere ayırıp, son olarak bunları ServiceBase'u miras alan sınıflarda birleştirip Arabirim1 veya Arabirim 2'yi uygular. örneğin:

[ServiceContract] 
public interface IServiceBase 
{ 
    [OperationContract] 
    void Method_A(); 

    [OperationContract] 
    void Method_B(); 
} 

[ServiceContract] 
public interface IService1 : IServiceBase 
{ 
    [OperationContract] 
    void Method_X1(); 
} 

[ServiceContract] 
public interface IService2 : IServiceBase 
{ 
    [OperationContract] 
    void Method_X2(); 
} 

public abstract class ServiceBase : IServiceBase 
{ 
    void Method_A() 
    { 
     ... implementation here ... 
    } 

    void Method_B() 
    { 
     ... implementation here ... 
    } 
} 

public class Service1 : ServiceBase, IService1 
{ 
    void Method_X1() 
    { 
     ... implementation here ... 
    } 
} 

public class Service2 : ServiceBase, IService2 
{ 
    void Method_X2() 
    { 
     ... implementation here ... 
    } 
} 
+0

Bu gerçekten iyi görünüyor ... Teşekkür ederim ... Size bir deneme yapıp size geri döneceğim – Learner

+0

Dürüst olmak gerekirse, verilen senaryo için çözümünüz iyidir. Gerçek dünya uygulamalarına giderken hangi çözümün en iyi ve esnek olduğunu bulmaya çalışıyorum ... Çözümünüzü marc'lerle nasıl karşılaştırırsınız? Aklınızdan geçen tüm düşünceleriniz ... bunları yazılı olarak gönderin, teşekkürler! – Learner

+0

Cevabınız doğru olduğu ve başka insanlara yardımcı olabileceğinden kabul ediyorum.Ama bir şeyden ziyade, bir çözümden daha çok bir bakış açısı istedim. Neyse, teşekkürler. – Learner

2

Aradım!!!?! :-)

varsa bir arayüz

public interface IServiceA 
{ 
    void Method_A(); 
    void Method_B(); 
    void Method_X1(); 
} 

ve ikinci bir

public interface IServiceB 
{ 
    void Method_A(); 
    void Method_B(); 
    void Method_X2(); 
} 

kesinlikle sunucu tarafında iki genel yöntemler için uygulama kodunu paylaşabilir.

(veya iki ayrı, ortak meclislerinde) ortak bir sınıf kitaplığında iki sınıfları MethodAHandler ve sunucu üzerinde MethodBHandler oluşturmak istiyorum ve sonra gibi bir şey kullanabilirsiniz

:

using MethodHandlers; // contains the two method handlers 

public class ServiceA : IServiceA 
{ 
    public void Method_A() 
    { 
     MethodAHandler hnd = new MethodAHandler(); 
     hnd.HandleMethodCall(); 
    } 

    public void Method_B() 
    { 
     MethodBHandler hnd = new MethodBHandler(); 
     hnd.HandleMethodCall(); 
    } 

    public void Method_X1() 
    { 
     // handle method X1 call here or delegate to another handler class 
    } 
} 

ve için ikinci hizmeti: sunucu tarafında

using MethodHandlers; // contains the two method handlers 

public class ServiceB : IServiceB 
{ 
    public void Method_A() 
    { 
     MethodAHandler hnd = new MethodAHandler(); 
     hnd.HandleMethodCall(); 
    } 

    public void Method_B() 
    { 
     MethodBHandler hnd = new MethodBHandler(); 
     hnd.HandleMethodCall(); 
    } 

    public void Method_X2() 
    { 
     // handle method X2 call here or delegate to another handler class 
    } 
} 

, .NET sınıfları ve kesinlikle ortak bir sınıf kütüphanesi aracılığıyla iki ayrı servis uygulaması arasındaki kodunu paylaşabilir ya da her ne için en iyi yaklaşım bulmak sen.

+0

Merhaba Marc. Çok güzel ve eksiksiz cevap ... Sana gerçekten saygı duyuyorum! Cevabınızı çok daha esnek buluyorum (hatta 'A' & 'B' yöntemlerinin bile ortak olmaması durumunda). Soyut dersle "C. Lawrence Wenham" yaklaşımına nasıl yorum yaparsınız? Artılar ve eksiler? ... Teşekkür ederim! – Learner

+0

Bir şekilde bu kalıtım fikrini beğendim ... Miras kullanmayı tercih ediyor musunuz? Düşüncelerin neler? – Learner

İlgili konular