在开始之前,我必须说,我可能会有些力不从心,但我正在绝望的学习狂潮中,我需要很多帮助。
我正在编写一个练习,使用两本书的样例:
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. 《.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和自定义控制器工厂组合。
所以我的问题是:
- 如果客户端实现了组合根,我是否还需要为WCF提供自定义的ServiceHostFactory、ServiceHost和IInstanceProvider实现?这不会让我有两个组合根吗?
- 如果(希望如此)我只需要客户端的组合根,在哪里创建具有依赖关系的构造函数?在服务的实现中,还是在服务的代理中,还是两者都有?
- 对象层次结构应该如何配置?我想首先使用“穷人的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);
}
}
}