1

介紹依賴注入到DTO

我使用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,我讀過它沒有曏者優先使用它。

+2

爲什麼不使用計算器作爲翻譯到DTO的一部分? – s1mm0t

+0

一旦你開始暴露對象方法,我不認爲它是一個DTO,甚至是間接的。我同意s1mm0t,只是在構建DTO時設置它的值 – Jason

回答

2

DTO通常具有一些屬性並且不包含任何邏輯。 您應該考慮設計您的MVC-控制器做這樣的事情:

  1. 獲取從服務客戶/數據訪問
  2. 通過調用這些方法可使用構造器注入傳遞給控制器​​的ICalculator計算折扣(或撥打額外的服務進行計算)
  3. 創建一個新的模型類,其中包含客戶和計算出的折扣並將此模型傳遞給視圖。
 
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); 
    } 
} 
1

首先:DTO的是不是一個視圖模型。

A DTO(數據傳輸對象)是一個虛擬類(它實際上不是第一類(OOP)公民)。它的目的只是在不同的層/層之間展開層次結構和傳輸信息。

A 查看模型用於調整模型(如在MVC中),以便更好地適合視圖。它的目的僅僅是從視圖中刪除邏輯並隱藏有關在視圖中不應使用/可用的模型的詳細信息。

除非您想違反Single Responsibility Principle,否則DTOViewModel都不應該用於其他任何內容。

你所要求的應該在你的控制器中完成(因爲它是模型和視圖之間的粘合劑)。因此,將ICalculator添加到控制器的構造函數中。