2012-12-04 47 views
1

我有很多已經實施的企業服務,並且我將它們公開爲WCF的服務。WCF爲專家避免太多端點

我不喜歡這個主意,有一個端點到每個服務.....它可能是在未來保持我的資料庫增長問題.......

I' d想知道wcf的專家意見,如果下面的代碼是一個好方法,那麼我可以繼續使用這個解決方案。

業務服務答:

[ServiceContract] 
public interface IServiceA 
{ 
    [OperationContract] 
    object AddA(object a); 
    [OperationContract] 
    object Update(); 
} 

業務服務B:

[ServiceContract] 
public interface IServiceB 
{ 
    [OperationContract] 
    object AddB(object b); 
    [OperationContract] 
    object Update(); 
} 

具體實施服務A

public class ConcreteServiceA : IServiceA 
{ 
    public object AddA(object a) 
    { 
     Console.WriteLine("ConcreateServiceA::AddA"); 
     return null; 
    } 

    public object Update() 
    { 
     Console.WriteLine("ConcreateServiceA::Update"); 
     return null; 
    } 
} 

混凝土實施服務B

public class ConcreteServiceB : IServiceB 
{ 
    public object AddB(object b) 
    { 
     Console.WriteLine("ConcreateServiceB::AddB"); 
     return null; 
    } 

    public object Update() 
    { 
     Console.WriteLine("ConcreateServiceB::Update"); 
     return null; 
    } 
} 

我的單一服務是局部,分離成每個服務的關注。 注意it's構造取決於商務服務上面,將使用IoC的

部分的構造

public partial class WCFService 
{ 
    IServiceA _a; 
    IServiceB _b; 
    public WCFService() 
     : this(new ConcreteServiceA(), new ConcreteServiceB()) 
    { 

    } 
    public WCFService(IServiceA serviceA, IServiceB serviceB) 
    { 
     _a = serviceA; 
     _b = serviceB; 
    } 
} 

部分類只實現IServiveA

public partial class WCFService : IServiceA 
{ 
    object IServiceB.AddB(object b) 
    { 
     return _b.AddB(b); 
    } 

    object IServiceB.Update() 
    { 
     return _b.Update(); 
    } 

} 

注射部分課程只實施IServiceB

public partial class WCFService : IServiceB 
{ 
    object IServiceA.AddA(object a) 
    { 
     return _a.AddA(a); 
    } 

    object IServiceA.Update() 
    { 
     return _a.Update(); 
    } 
} 

而在客戶端,我用這樣的:

 var endPoint = new EndpointAddress("http://localhost/teste"); 
     ChannelFactory<IServiceA> _factoryA = new ChannelFactory<IServiceA>(new BasicHttpBinding(), endPoint); 
     IServiceA serviceA = _factoryA.CreateChannel(); 
     serviceA.Update(); 

     var netTcpEndPoint = new EndpointAddress("net.tcp://localhost:9000/teste"); 
     ChannelFactory<IServiceB> _factoryB = new ChannelFactory<IServiceB>(new NetTcpBinding(), netTcpEndPoint); 
     IServiceB serviceB = _factoryB.CreateChannel(); 
     serviceB.Update(); 

我真的很感激任何意見或其他建議。

回答

0

多個端點沒有什麼問題 - 這是過程的一部分。然而,什麼是錯誤的是重複多個端點的功能。開發人員需要多少「UpdateThis's」或「AddThat」?這可能會失控並導致維修頭痛。只要看看你的構造函數,當你添加新的服務並將它們合併成一個服務時,它會不斷增長和增長。

認爲粗粒度不細粒度。

作爲替代方案,也許您可​​以嘗試將請求對象作爲參數傳遞並返回響應對象。這種方法可以簡化你的代碼,並幫助你避免你在文章中提到的維護問題,並給你一個建議。

因此,它看起來是這樣的:

// Your service will return a very generic Response object 
public interface IService 
    { 
     Response YourRequest(Request request); 
    } 

// Your service implementation 
public partial class WCFService : IService 
    { 
     Response IService.YourRequest(Request request) 
     { 
      //inspect the Request, do your work based on the values 
      //and return a response object    
     } 
    } 

// Your request object 
public class Request() 
    { 
     object YourClass{get;set;} 
     DoWhat Action{get;set;} //enum, constants, string etc. 
     int ID {get; set;} 
    } 

// Your response object 
    public class Response() 
     { 
      bool Success {get; set;} 
     } 

// Create Request object 
var request = new Request(){YourClass = YourClassName , Action DoWhat.Update(), ID=1}; 

// Your service call 
var endPoint = new EndpointAddress("http://localhost/teste"); 
       ChannelFactory<IService> _factory = new ChannelFactory<IService>(new BasicHttpBinding(), endPoint); 
       IService service = _factory.CreateChannel(); 
var response = service.YourRequest(request); 

所以,現在你已經刪除了精細的方法,並與粗粒度一個替代它。讓我知道你是否想要更多的細節。

+0

你說的'想粗粒度不細粒度'是對的,我會爲每個服務工作一個端點。關於您的請求/響應類的建議非常好,可以通過WCF使用泛型和委託?例如:service.Request ((x,y)=> x.Add(y)) – will

+0

我不明白爲什麼不。只需按照請求/響應模式進行操作,就可以減少維護次數。 –