gpt4 book ai didi

c# - 将依赖项注入(inject) DTO

转载 作者:行者123 更新时间:2023-11-30 22:33:22 25 4
gpt4 key购买 nike

简介

我正在使用 ASP.Net MVC3。我的 Controller 与服务层对话,服务层与使用 Entity Framework 的数据访问层对话。我使用 Entity Framework 获得了一个特定的实体。该实体被转换为 DTO。然后我将这个 DTO 传递给 MVC Controller 。像这样:

伪代码:

// 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 注入(inject)一个计算器?我可以想办法做到这一点:

var calculator = DependencyResolver.Current.GetService<ICalculator>;
var dto = new DTO(calculator );

但我不知道这是否是最好的方法,因为它有 ServiceLocator 的味道,而且我读到过不推荐使用它。

最佳答案

DTO 通常具有一些属性并且不包含任何逻辑。您应该考虑一种设计,让您的 MVC Controller 执行如下操作:

  1. 从服务/数据访问中获取客户
  2. 通过调用 ICalculator 来计算折扣,ICalculator 可以使用构造函数注入(inject)传递给 Controller(或调用执行计算的额外服务)
  3. 创建一个包含客户和计算出的折扣的新模型类,并将该模型传递给 View 。
public class Model{  public Customer Customer { get; set; }  public double Discount { get; set; }}public class SomeController : Controller{  private readonly DataAccess dataAccess;  private readonly ICalculator calculator;  public SomeController(DataAccess dataAccess, ICalculator calculator)  {    this.dataAccess = dataAccess;    this.calculator = calculator;  }  public ActionResult Index(int id)  {    var model = new Model();    model.Customer = this.dataAccess.Get(id);    model.Discount = this.calculator.Calculate(customer);    return View(model);  }}

关于c# - 将依赖项注入(inject) DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8341775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com