2013-02-04 68 views
5

我開始學習Unity容器和依賴注入。我很難理解我的對象模型應該是什麼樣子。Unity容器,解決單個對象

對於我的例子中,我創建了一個非常簡單的Employee類(我省略了構造函數,因爲這是我對混淆):

public class Employee 
{ 
    private int _id; 
    private string _name; 
    private DateTime _birthDate; 

    public int Id 
    { 
     get { return _id; } 
    } 

    public string Name 
    { 
     get { return _name; } 
    } 

    public DateTime BirthDate 
    { 
     get { return _birthDate; } 
    } 
} 

這Employee對象應該從數據庫中獲取其信息。這裏是一個墊片數據庫適配器,只是制定了依賴性:

public class DataAdapter 
{ 
    public DbParameter NewParameter(string name, object value) 
    { 
     return new OracleParameter(name, value); 
    } 

    public DataRow ExecuteDataRow(string command, CommandType commandType, List<DbParameter> parameters) 
    { 
     DataTable dt = new DataTable(); 

     dt.Columns.Add(new DataColumn("ID")); 
     dt.Columns.Add(new DataColumn("NAME")); 
     dt.Columns.Add(new DataColumn("BIRTH_DATE")); 

     DataRow dr = dt.NewRow(); 

     dr["ID"] = new Random().Next(); 
     dr["NAME"] = "John Smith"; 
     dr["BIRTH_DATE"] = DateTime.Now; 

     return dr; 
    } 
} 

理想的情況下,員工的對象應該採取一個「id」參數,以便知道從數據庫中檢索的員工。比方說,我們使用了一個Employee構造,看起來像這樣:

public Employee(int id, DataAdapter dataAdapter) 
{ 
    List<DbParameter> parameters = new List<DbParameter>(); 

    parameters.Add(dataAdapter.NewParameter("ID", id)); 

    DataRow dr = dataAdapter.ExecuteDataRow("GetEmployee", CommandType.StoredProcedure, parameters); 

    if (dr == null) 
     throw new EmployeeNotFoundException(); 

    _id = id; 
    _name = Convert.ToString(dr["NAME"]); 
    _birthDate = Convert.ToDateTime(dr["BIRTH_DATE"]); 

    _id = employeeData.Id; 
    _name = employeeData.Name; 
    _birthDate = employeeData.BirthDate; 
} 

我不知道如何指定員工使用Unity的解析器ID除了使用ParameterOverride:

class Program 
{ 
    static void Main(string[] args) 
    { 
     UnityContainer container = new UnityContainer(); 

     container.RegisterType(typeof(EmployeeData)); 

     Employee emp = container.Resolve<Employee>(new ParameterOverride("id", 45)); 

     Console.WriteLine(emp.Id); 
     Console.WriteLine(emp.Name); 
     Console.WriteLine(emp.BirthDate); 
     Console.ReadKey(); 
    } 
} 

我不喜歡這是因爲沒有編譯時檢查來查看參數名稱是否正確。像這樣的問題使我認爲我錯誤地應用了模式。任何人都可以闡明我誤解的內容嗎?

謝謝!

回答

6

依賴注入不打算在域模型/業務對象上使用。主要是解決服務問題,即用於處理業務邏輯的類。

因此,您的人通常使用存儲庫或任何其他數據訪問模式加載。

所以:

  1. 你的數據訪問類使用DI
  2. 你的數據訪問類作爲一個工廠注入產生的人。

public class PersonRepository 
{ 
    public PersonRepository(IDbConnection iGetInjected) 
    { 
    } 

    public Person Get(int id) 
    { 
     // I create and return a person 
     // using the connection to generate and execute a command 
    } 
} 
+0

啊,好吧,我試圖避免使用Factory模式,因爲我認爲它們有些相互排斥,但我想它們是互補的。謝謝你的幫助! –

0

您正在使用此模式不正確。 DI主要是通過接口注入依賴關係。

您的代碼應該是這樣的:

接口

public interface IEmployee 
{ 
    int Id { get; set;} 
    string name { get; set;} 
    DateTime BirthDate { get; set; } 
} 

和實施

public class Employee : IEmployee 
{ 
    public int Id { get; set;} 
    public string name { get; set;} 
    public DateTime BirthDate { get; set; } 
} 

,那麼你可以通過解決依賴性:

class Program 
{ 
    static void Main(string[] args) 
    { 
     UnityContainer container = new UnityContainer(); 

     container.RegisterType(typeof(IEmployee), typeof(Employee)); 

     IEmployee emp = container.Resolve<IEmployee>(); 

     Console.ReadKey(); 
    } 
} 

無根據您的需要,您可以使用不同的IEmployee接口實現。

+0

我沒有downvote你,但我懷疑這是因爲你沒有解釋如何解決我的問題的「ID構造函數的參數」部分。謝謝你的回覆! –