当组合根在客户端上时,如何在WCF中注入依赖

本文关键字:WCF 注入 依赖 组合 客户端 | 更新日期: 2023-09-27 18:15:43

在我开始之前,我必须说我可能贪多嚼不烂,但我正处于绝望的学习狂暴中,我需要很多帮助。

我正在编写一个练习,从两本书中获取样本:
1. .Net中的依赖注入——Mark Seemann2. 专业ASP .Net设计模式:Brian Egan和Steve Valenzuela

练习是使用WCF作为服务层实现请求/响应消息传递模式,在客户端应用程序中使用来自组合根的依赖注入。

从2:


在练习中,对于服务层,我有五个类库:
—契约:为服务的契约提供接口。
-数据契约:使用DataContractAttribute
装饰的所有对象—HttpHost: WCF服务的主机。此库包含所有svc文件
- ServiceProxy:该库手动实现服务的代理,供客户端使用
—服务:包含服务的实现。

从1:


我想用控制台和asp.net MVC客户端来测试这个练习,所以组合根是第一个的Main方法和Global方法。第二个是ax和自定义控制器工厂的组合。

我的问题是:

  1. 如果组合根是在客户端上实现的,我是否必须为WCF中的ServiceHostFactory, ServiceHost和IInstanceProvider提供一个自定义实现?这不会使我有两个构成根吗?
  2. 如果(希望)我只需要组合根在客户端,我在哪里创建与依赖关系的构造器?在服务的实现中,还是在服务的代理中,还是在两者中?
  3. 对象层次结构应该如何配置?我想首先使用穷人的DI,一旦运行,将结构图合并为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>, IPurchaseOrderService
    {
        public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.CreatePurchaseOrder(purchaseOrderRequest);
        }
        public PurchaseOrderResponse UpdateState(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.UpdateState(purchaseOrderRequest);
        }
    }
}

当组合根在客户端上时,如何在WCF中注入依赖

每个应用程序都有自己的Composition根。WCF服务是一个独立的应用程序,这意味着它有自己的组合根。

或者让我换一种说法,客户端不应该规定服务将如何构建其对象图,这很难想象,因为服务将生活在自己的进程中,而且通常是在单独的机器上。

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