如何在客户端的组合根上注入WCF依赖项

3
在开始之前,我必须说,我可能会有些力不从心,但我正在绝望的学习狂潮中,我需要很多帮助。
我正在编写一个练习,使用两本书的样例:
1. 《.Net中的依赖注入》(作者:Mark Seemann)
2. 《专业ASP .Net设计模式》(作者:Brian Egan和Steve Valenzuela)
该练习使用WCF作为服务层来实现请求/响应消息模式,并使用客户端应用程序中的组合根进行依赖注入。
根据第二本书:
在该练习中,我的服务层包括以下五个类库:
- Contracts:服务协议的接口
- Data Contracts:与DataContractAttribute装饰的所有对象
- HttpHost:WCF服务的主机,包含所有svc文件
- ServiceProxy:手动实现客户端使用的服务代理
- Services:包含服务的实现。
根据第一本书:
我想使用控制台和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>, IPurchaseOrderService
    {
        public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.CreatePurchaseOrder(purchaseOrderRequest);
        }

        public PurchaseOrderResponse UpdateState(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.UpdateState(purchaseOrderRequest);
        }
    }
}

面对挑战会让你更上一层楼。你能把标题中的“no”改成“on”吗? - Gert Arnold
@GertArnold:感谢您注意到这个错别字 :) - Sergio Romero
相关:由于在谷歌上搜索“WCF组合根”会引导至此处,而有用的答案可能被埋没在哪一页上,因此请参考以下链接: https://dev59.com/wnE95IYBdhLWcg3wGqEH#2455039 - Igand
1个回答

4
每个应用程序都有自己的组合根。WCF服务是一个独立的应用程序,这意味着它有自己的组合根。
或者换句话说,客户端不应该决定服务如何构建其对象图,因为服务将在其自己的进程中运行,通常在单独的计算机上,很难想象客户端会对此产生影响。
这并不意味着多个应用程序(例如在同一解决方案中)不能共享DI配置的一部分,但是客户端和服务的对象图可能几乎没有共同之处(它们没有共享相同的代码库)。例如,当您同时构建一个使用相同业务层的WCF服务和Windows服务时,您将看到更多的配置共享。但即使在这种情况下,尽管它们可能共享大部分DI配置,我们仍然会说它们有自己的组合根。

所以如果我理解正确的话,这意味着客户端(例如MVC)将拥有容器的一个实例,我将在那里配置控制器接收服务代理的实例。另一方面,WCF项目将拥有其自己的容器实例,我将在其中配置所有依赖项,直到存储库。对吗?我甚至不应该考虑注入容器到WCF中。是吗? - Sergio Romero
我刚刚按照这种方式实现了它,实际上看起来非常不错。谢谢。 - Sergio Romero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接