正在将依赖项注入DTO
本文关键字:注入 DTO 依赖 | 更新日期: 2023-09-27 18:16:34
简介
我使用的是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控制器执行以下操作的设计:
- 从服务/数据访问中获取客户
- 通过调用ICalculator来计算折扣,ICalculater可以使用构造函数注入传递给Controller(或调用执行计算的额外服务(
- 创建一个包含客户和计算折扣的新模型类,并将此模型传递给视图
公共类模型{公共客户客户{get;set;}公共双重折扣{get;set;}}公共类SomeController:控制器{专用只读数据访问数据访问;专用只读ICalculator计算器;public SomeController(DataAccess DataAccess,ICalculator计算器({this.dataAccess=数据访问;this.calculator=计算器;}公共ActionResult索引(int id({var model=new model((;模型客户=this.dataAccess.Get(id(;模型折扣=this.calculator.Calculate(客户(;return视图(模型(;}}
首先:DTO不是视图模型。
DTO(数据传输对象(是一个伪类(它实际上不是第一类(OOP(公民(。它的目的只是使层次结构变平,并在不同的层/层之间传输信息。
视图模型用于调整模型(如MVC(,使其更适合视图。它的目的只是从视图中删除逻辑,并隐藏不应在视图中使用/可用的有关模型的详细信息。
除非您想违反单一责任原则,否则DTO
或ViewModel
都不应用于其他任何事情。
您所要求的应该在控制器中完成(因为它是模型和视图之间的粘合剂(。因此,将ICalculator
添加到控制器的构造函数中。