介绍

我正在使用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);
  }
}

10-06 08:07