我開始學習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();
}
}
我不喜歡這是因爲沒有編譯時檢查來查看參數名稱是否正確。像這樣的問題使我認爲我錯誤地應用了模式。任何人都可以闡明我誤解的內容嗎?
謝謝!
啊,好吧,我試圖避免使用Factory模式,因爲我認爲它們有些相互排斥,但我想它們是互補的。謝謝你的幫助! –