【发布时间】:2010-09-23 03:29:49
【问题描述】:
假设我有服务层做休眠和数据库的东西。 Silverlight 和 windows 客户端需要通过某种远程服务来获取服务层。 如果 ASP.NET 可以直接获取它(在同一台机器、同一进程、类实例化上),它将受益。
使用 spring 或其他工具通过 DI 容器“获取”您的服务层并能够在以后更改配置是个好主意吗?
【问题讨论】:
标签: web-services spring architecture
假设我有服务层做休眠和数据库的东西。 Silverlight 和 windows 客户端需要通过某种远程服务来获取服务层。 如果 ASP.NET 可以直接获取它(在同一台机器、同一进程、类实例化上),它将受益。
使用 spring 或其他工具通过 DI 容器“获取”您的服务层并能够在以后更改配置是个好主意吗?
【问题讨论】:
标签: web-services spring architecture
当然。您应该有某种服务层使用的接口,然后您可以随时更改实现,只要它实现相同的接口,它应该是可互换的。
这就是接口和 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();
}
}
无论如何,您都可以通过多种方式注入该依赖项。困难的部分是您需要使用您的界面设置合同,并且您的对象必须遵守该合同,否则您将遇到麻烦。但总有一种方法可以映射(例如,使用上面的适配器模式)对象,使其看起来像是实现了接口并使其工作。
【讨论】: