如果组合根位于客户端上,如何在WCF中注入依赖项

在我开始之前,我必须说我咬的可能比我能咀嚼的多,但是我处于绝望的学习浪潮中,我需要很多帮助。

我正在编写一个练习,从两本书中取样:
1. Mark Seemann在.Net中的dependency injection
2. Brian Egan和Steve Valenzuela的专业ASP .Net设计模式

该练习使用WCF作为服务层使用客户端应用程序中的合成根的dependency injection来实现请求/响应消息传递模式。

从2开始:
在练习中,对于服务层,我有五个类库:
– 合同:与服务合同的接口。
– 数据协定:包含使用DataContractAttribute修饰的所有对象
– HttpHost:WCF服务的主机。 该库包含所有svc文件
– ServiceProxy:此库手动实现客户端要使用的服务代理
– 服务:包含服务的实现。

从1开始:
我想用控制台和ASP .Net MVC客户端测试这个练习,因此组合根是第一个的Main方法,第二个是Global.asax和自定义控制器工厂组合。

所以我的问题是:

  1. 如果在客户端上实现组合根,我是否必须为WCF中的ServiceHostFactory,ServiceHost和IInstanceProvider提供自定义实现? 难道这不会让我有两个组成根源吗?
  2. 如果(希望)我只需要客户端中的组合根,我在哪里创建具有依赖项的构造函数? 在服务的实现中,还是在服务的代理中,还是在两者中?
  3. 应该如何配置对象层次结构? 我想首先使用穷人的DI,并且一旦运行将Structure Map作为IoC容器。

非常感谢你的帮助。

这是我到目前为止的代码(我不包括服务合同或数据合同):

服务实施:

namespace Exercise.Services { public class PurchaseOrderService : IPurchaseOrderService { private readonly IPurchaseOrderFacade PurchaseOrderFacade; public PurchaseOrderService(IPurchaseOrderFacade purchaseOrderFacade) { PurchaseOrderFacade = purchaseOrderFacade; } public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest) { var purchaseOrder = PurchaseOrderFacade.CreatePurchaseOrder(purchaseOrderRequest.ToPurchaseOrder()); var purchaseOrderResponse = purchaseOrder.ToPurchaseOrderResponse(); purchaseOrderResponse.IsSuccessful = true; return purchaseOrderResponse; } public PurchaseOrderResponse UpdateState(PurchaseOrderRequest purchaseOrderRequest) { var purchaseOrder = PurchaseOrderFacade.UpdateState(purchaseOrderRequest.ToPurchaseOrder()); var purchaseOrderResponse = purchaseOrder.ToPurchaseOrderResponse(); purchaseOrderResponse.IsSuccessful = true; return purchaseOrderResponse; } } } 

这是客户端的代理:

 namespace Exercise.ServiceProxy { public class PurchaseOrderProxy : ClientBase, IPurchaseOrderService { public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest) { return base.Channel.CreatePurchaseOrder(purchaseOrderRequest); } public PurchaseOrderResponse UpdateState(PurchaseOrderRequest purchaseOrderRequest) { return base.Channel.UpdateState(purchaseOrderRequest); } } } 

每个应用程序都有自己的组合根。 WCF服务本身就是一个应用程序,意味着它有自己的组合根。

或者让我换句话说,客户端不应该指示服务如何构建其对象图,而且很难想象,因为服务将存在于自己的进程中,并且通常在单独的机器上。

这并不意味着多个应用程序(例如在同一个解决方案中)不能共享DI配置的一部分,但客户端和服务的对象图甚至可能没有什么共同之处(它们没有多少共享相同的代码库)。 例如,当您构建使用相同业务层的WCF服务和Windows服务时,您将看到更多的配置共享。 但即使在这种情况下,虽然它们可能共享DI配置的很大一部分,但我们仍然会说它们有自己的组合根。