在开始之前,我必须说,我可能咬得太多,但我正处于绝望的学习狂潮中,我需要很多帮助。
我正在编写一个练习,从两本书中获取样本:
1. .Net 中的依赖注入 作者:Mark Seemann
2. Brian Egan 和 Steve Valenzuela 的专业 ASP .Net 设计模式
该练习是使用 WCF 作为服务层来实现请求/响应消息传递模式AND在客户端应用程序中使用来自组合根的依赖注入。
From 2:
在练习中,对于服务层,我有五个类库:
- 合同:具有服务合同的接口。
- 数据契约:所有用 DataContractAttribute 修饰的对象
- HttpHost:WCF 服务的主机。该库包含所有 svc 文件
- ServiceProxy:该库手动实现服务的代理以供客户端使用
- 服务:包含服务的实现。
From 1:
我想使用控制台和 ASP .Net MVC 客户端来测试此练习,因此组合根是第一个的 Main 方法,以及第二个的 Global.asax 和自定义控制器工厂组合。
所以我的问题是:
- 如果组合根正在客户端上实现,我是否必须为 WCF 中的 ServiceHostFactory、ServiceHost 和 IInstanceProvider 提供自定义实现?这难道不会让我有两个作文根吗?
- 如果(希望)我只需要客户端中的组合根,那么我在哪里创建具有依赖项的构造函数?在服务的实现中或在服务的代理中或两者中?
- 对象层次结构应该如何配置?我想首先使用 Poor Man 的 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);
}
}
}