【问题标题】:Using spring to get your service layer - good idea?使用 spring 来获取您的服务层 - 好主意吗?
【发布时间】:2010-09-23 03:29:49
【问题描述】:

假设我有服务层做休眠和数据库的东西。 Silverlight 和 windows 客户端需要通过某种远程服务来获取服务层。 如果 ASP.NET 可以直接获取它(在同一台机器、同一进程、类实例化上),它将受益。

使用 spring 或其他工具通过 DI 容器“获取”您的服务层并能够在以后更改配置是个好主意吗?

【问题讨论】:

    标签: web-services spring architecture


    【解决方案1】:

    当然。您应该有某种服务层使用的接口,然后您可以随时更改实现,只要它实现相同的接口,它应该是可互换的。

    这就是接口和 DI 的好处,尤其是使用 Spring 这样的容器。更改实现后,只需将 spring 配置为使用新的即可。


    因为 cmets 太小而更新:

    好吧,我想这一切都取决于您的服务。问题是,如果你使用一个接口(比如在 NServiceBus 之上),你总是可以创建一个适配器来将你的 WCF 实现插入到接口中。

    例如:

    public interface IService {
       void DoSomething();
    }
    
    public class NServiceBusService : IService { 
       public void DoSomething() {
          //Some NServiceBusCode
       }
    }
    

    现在(我猜,我对 spring.net 不是很熟悉),你可以让 Spring 使用 NServiceBusService 作为 IService 的实现。

    现在您决定改为插入 WCF?你可以有一个 WCF 实现:

    public class WCFService : IService { 
       public void DoSomething() {
          //Some WCF Code
       }
    }
    

    现在您可以将 Spring 设置为将 WCFService 用于 IService 而不是 NServiceBusService。

    或者,如果您的 WCFService 与 IService 的签名不匹配,可能如下所示:

    public class WCFService { 
       public void DoSomethingWCFStyle() {
          //Some WCF Code
       }
    }
    

    然后您可以使用适配器模式来完成这项工作:

    public class WCFServiceAdapter : IService { 
       private WCFService wcfService;
    
       public WCFServicAdapter(WCFService wcfService) {
          this.wcfService = wcfService;
       }
    
       public void DoSomething() {
          wcfService.DoSomethingWCFStyle();
       }
    }
    

    无论如何,您都可以通过多种方式注入该依赖项。困难的部分是您需要使用您的界面设置合同,并且您的对象必须遵守该合同,否则您将遇到麻烦。但总有一种方法可以映射(例如,使用上面的适配器模式)对象,使其看起来像是实现了接口并使其工作。

    【讨论】:

    • 你会实现什么样的接口?我的意思是……有不同类型的服务。如果我调用“RegisterOrder”之类的操作,我以后可以将它与 WCF 样式的服务一起使用……但这与 REST 或 NServiceBus 不兼容……你怎么看?
    • @mendicant:感谢大更新。这很有道理。我想知道这些适配器是否可以涵盖具有完全不同类型服务的情况......例如,当 CRUD 服务只有 Add(Object)方法时,RPC 服务可能有方法“AddOrder”和“AddCustomer”。 .:)
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2016-02-24
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多