介绍
我正在使用ASP.Net MVC3。我的控制器与服务层通信,服务层与使用实体框架的数据访问层通信。
我使用实体框架得到一个特定的实体。该实体将转换为DTO。然后,我将此DTO交付给MVC控制器。像这样:
伪代码:
// This is inside my Service Layer
var entity = DataAccess.GetById(id);
var dto = createDtoWithValuesFrom(entity);
return dto; // Return dto to MVC controller
在此DTO中,我想使用一个依赖项,例如计算器。假设我的DTO如下所示:
public class Customer
{
private ICalculator Calculator;
public class Customer(ICalculator calculator)
{
Calculator = calculator;
}
public string Name { get; set; }
public decimal Discount
{
get
{
return Calculator.Discount();
}
}
}
问题
如何实例化DTO,并让Autofac注入计算器?
我可以想到一种方法:
var calculator = DependencyResolver.Current.GetService<ICalculator>;
var dto = new DTO(calculator );
但是我不知道这是否是最好的方法,因为它闻到了ServiceLocator的味道,而且我读到它不喜欢使用它。
最佳答案
DTO通常具有某些属性,并且不包含任何逻辑。
您应该考虑一种设计,其中MVC-Controller会执行以下操作:
从服务/数据访问中获取客户
通过调用ICalculator计算折扣,该折扣可以使用构造函数注入传递给Controller(或调用执行计算的额外服务)
创建一个包含客户和计算出的折扣的新模型类,然后将此模型传递给视图。
公共课模型
{
公开客户客户{组; }
公众双重折扣{组; }
}
公共类SomeController:控制器
{
私有只读DataAccess dataAccess;
私有只读ICalculator计算器;
公共SomeController(DataAccess dataAccess,ICalculator计算器)
{
this.dataAccess = dataAccess;
this.calculator =计算器;
}
公共ActionResult索引(整数id)
{
var model = new Model();
model.Customer = this.dataAccess.Get(id);
model.Discount = this.calculator.Calculate(customer);
返回View(model);
}
}