【问题标题】:WCF - looking for best practice when having multiple contracts sharing common methodsWCF - 在多个合同共享通用方法时寻找最佳实践
【发布时间】:2011-04-07 23:46:33
【问题描述】:

我打算让一个核心模块暴露接口,以便其他大模块(不同的客户端)可以与之通信。如果,比如说,有一组方法:

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

向一种类型的客户端(模块“X1”)公开,并且:

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

暴露给其他类型的客户端(模块“X2”)并知道Method_AMethod_B 应该有确切的实现......那么我怎样才能最好地设计服务架构(在服务和合同)?

是否有机会只实现一次 Method_A 和 Method_B(在不同的合约实现中不是 2 次)?

在使用 WCF 时我应该如何从接口继承中受益?

提前谢谢大家,如果我需要更清楚,请告诉我!

@marc_s...我非常感谢您的观点...

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    类可以继承满足接口的方法,所以你可以有一个IServiceBase接口和ServiceBase类,只实现Method_AMethod_B,然后将唯一的方法挑出到单独的接口中,最后组合它们一起在继承ServiceBase 并实现接口1 或接口2 的类中。例如:

    [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 ...
        }
    }
    

    【讨论】:

    • 这看起来真的很不错...谢谢...我会尝试一下并回复您
    • 老实说,对于给定的场景,您的解决方案是好的。我只是想弄清楚在实际应用中哪种解决方案最好且灵活……您如何将您的解决方案与 marc 的解决方案进行比较?无论你有什么想法......把它们写下来,谢谢!
    • 我接受您的回答,因为它是正确的并且可能对其他人有所帮助。但我想要更多关于事物的观点,而不是解决方案。无论如何,谢谢。
    【解决方案2】:

    我被召唤了!?!?! :-)

    如果你只有一个接口

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

    还有第二个

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

    服务器端两种常用方法的实现代码完全可以共享。

    您将在您的服务器上创建两个类 MethodAHandlerMethodBHandler,在一个公共类库中(或在两个单独的公共程序集中),然后您可以使用类似的东西:

    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
       }
    }
    

    对于第二个服务:

    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 类,您完全可以通过公共类库或任何您认为最适合您的方法在两个独立的服务实现之间共享代码。

    【讨论】:

    • 嗨,马克。非常好的和完整的答案......我真的很尊重你!我发现您的答案更加灵活(以防“A”和“B”方法不再常见)。您如何评价抽象类的“C. Lawrence Wenham”方法?优点缺点? ...谢谢!
    • 不知何故我喜欢这种继承的想法......你选择不使用继承吗?你有什么想法?
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多