正在将依赖项注入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

DTO通常具有一些属性,不包含任何逻辑。您应该考虑MVC控制器执行以下操作的设计:

  1. 从服务/数据访问中获取客户
  2. 通过调用ICalculator来计算折扣,ICalculater可以使用构造函数注入传递给Controller(或调用执行计算的额外服务(
  3. 创建一个包含客户和计算折扣的新模型类,并将此模型传递给视图
公共类模型{公共客户客户{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(,使其更适合视图。它的目的只是从视图中删除逻辑,并隐藏不应在视图中使用/可用的有关模型的详细信息。

除非您想违反单一责任原则,否则DTOViewModel都不应用于其他任何事情。

您所要求的应该在控制器中完成(因为它是模型和视图之间的粘合剂(。因此,将ICalculator添加到控制器的构造函数中。