为什么.net WCF服务需要接口

dex*_*ter 12 .net polymorphism wcf c#-4.0

与asmx实现不同,wcf需要您实现它的接口.我不太明白这种设计背后的原因.接口是两个类之间的契约......说到这一点,你有多少次有2个wcf服务满足相同的接口但实现方式不同?

另一条评论,msdn强烈建议这样做:

   MyService service = new MyService();

   try {

      service.DoWork();

   }
   catch(Exception) {}
   finally {
      service.Close();
   }
Run Code Online (Sandbox Code Playgroud)

所以,假设我要使用它的界面注入我的服务,如下所示:

   public MyComponent : IDisposable
   {

       readonly IMyService service = null;

       public MyComponent(IMyService service) {

           this.service = service;

       }

       public DoWork() 
       {
           //some additional code.
           this.service.DoWork();

       }

       public void Dispose() 
       {
           //The Interface does not have the Close method,
           //So doing this defeats the whole purpose of polymorphysm
           (this.service as MyService).Close(); //Silly.
       }
   } 
Run Code Online (Sandbox Code Playgroud)

你如何利用WCF的界面?

mar*_*c_s 24

不,WCF 不要求您拥有接口并实现它.

这只是普遍接受的最佳实践这么做-但你不会,如果你不想.

如果你愿意,你可以把你带到[ServiceContract]一个具有多种[OperationContract]服务方法的具体课程- 没有什么能阻止你这样做.

但同样:它通常被接受并传播最佳实践,使用接口将实际合同分离为接口(因此您可以例如模拟它进行测试等).


McG*_*V10 9

实际上,甚至MSDN也不时承认接口的形式并不总是"正确的做法":

http://msdn.microsoft.com/en-us/library/ms733070.aspx

"通过将ServiceContractAttribute和OperationContractAttribute分别直接应用于类和类的方法来创建服务的优点是速度和简单性."


Fre*_*örk 6

可以在不使用接口的情况下创建WCF服务:

[ServiceContract]
public class TheService
{
   // more stuff here
}
Run Code Online (Sandbox Code Playgroud)

也就是说,建议将它们分开.将合同与实施分开可以给您一些不同的优势:

  • 您可以将接口放入单独的程序集中.任何需要了解接口的代码都可以使用此程序集,但不一定是关于实现.我有时使用它来构建一种包含与服务通信的服务网关.
  • 您可以让一个类实现多个接口.这意味着您可以使用WCF端点中的不同接口以不同方式公开相同的实现类.

还有其他原因,但立即浮现在脑海中.