C# Service先生,暴露这个方法,否则我赢了';t打电话给你,真诚的远程程序

C# Service先生,暴露这个方法,否则我赢了';t打电话给你,真诚的远程程序,c#,web-services,wcf,design-patterns,soa,C#,Web Services,Wcf,Design Patterns,Soa,我必须开发一个“大软件”和更小的“卫星适配器”服务(远程),大软件可以调用 每个“卫星适配器”都实现相同的方法 我需要的是从big soft提供一个契约接口(方法用对象作为参数发送,对象作为返回来命名),每个“卫星适配器”服务都被默认地强制实现,以便被big soft调用。这样,我可能只开发一次大软件,并且可以添加新适配器作为插件 调用后来开发的新适配器也应该只是一个URI更改 问题: 是否有一种SOA模式可以解决这个问题?这有我可以在网上找的名字吗 如果这不是一种模式,那么听起来肯定是以前需要

我必须开发一个“大软件”和更小的“卫星适配器”服务(远程),大软件可以调用

每个“卫星适配器”都实现相同的方法

我需要的是从big soft提供一个契约接口(方法用对象作为参数发送,对象作为返回来命名),每个“卫星适配器”服务都被默认地强制实现,以便被big soft调用。这样,我可能只开发一次大软件,并且可以添加新适配器作为插件

调用后来开发的新适配器也应该只是一个URI更改

问题:

  • 是否有一种SOA模式可以解决这个问题?这有我可以在网上找的名字吗
  • 如果这不是一种模式,那么听起来肯定是以前需要的。在哪里可以找到用C#解决的例子
  • 你能告诉我一个在.net中解决这个问题的方法吗

  • 您可以使用
    界面定义合同

    public interface IMyContract {
    
        // Methods, properties, etc. that the contract needs defined
    }
    
    您的不同“卫星适配器”服务通过以下方式实现合同:

    public class MySuperDuperService : IMyContract {
    
        // Properties & methods particular to what this service does.
        // You must provide an implementation for every property & method defined by IMyContract in here, too.
    }
    
    “big soft”程序可以具有一个或多个属性,其中包含对实现
    接口的类实例的引用,也可以具有传递对实现服务的对象的引用的方法:

    public class BigSoft {
    
        public IMyContract SatelliteAdapter { get; set; }
    
        public void DoSomething( IMyContract adapter ) {
            // code here
        }
    
    }

    等等。这样,
    BigSoft
    就不知道每个服务做什么,但它可以使用其中的任何一个,因为它希望每个服务都有相同的方法和属性,而且它们都有。在每个附属适配器类中定义IMyContract
    接口
    中定义的所有属性和方法之前,编译器不会生成可执行文件

    您应该知道的另一件事是:一个类只能从一个类派生,但它可以实现您希望它实现的所有接口。就是

    public class MyService : ServiceBase, IMyContract1, IMyContract2 { . . . }
    
    只有在以下情况下才完全合法:

    • 逗号分隔列表中的所有内容都是一个接口,或
    • ServiceBase是一个类,IMyContract1、IMyContract2是接口

    一个常见的约定是使用大写字母“I”作为所有
    接口的第一个字母,这就是我在示例中所做的,因此您可以查看代码&知道
    ServiceBase
    必须是一个类,其他两个必须是
    接口
    。此外,如果您想从现有类中删除新类,则超级类名必须位于列表的第一位。

    为了澄清这一点,只需在适配器上添加引用并实现接口(适配器本身仅从引用中知道该接口)并在远程BigSoft上创建该接口就足够了?另外:这与任何模式一致吗?我相信这就是所谓的服务模式,但我还没有研究过那里的标准模式。在“模式”成为计算机科学的一部分之前,我就开始编程了。当您说“在适配器上添加引用”时,您指的是
    公共类MyService:IMyContract{…}
    行吗?如果是,是的。也就是说,“这个类实现了
    IMyContract
    接口”,这就是
    BigSoft
    所需要的一切。你不能让一个接口序列化,只能是一个具体的类。为此,您的类必须实现
    ISerializable
    接口()