gpt4 book ai didi

c# - Unity容器,解析单个对象

转载 作者:太空狗 更新时间:2023-10-29 23:08:53 25 4
gpt4 key购买 nike

我开始学习 Unity 容器和依赖注入(inject)。我很难理解我的对象模型应该是什么样子。

在我的示例中,我创建了一个非常简单的 Employee 类(我省略了 Constructor,因为我对此感到困惑):

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 对象应该从数据库中获取它的信息。这是一个 shim 数据库适配器,只是为了开发一个依赖项:

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;
}

除了使用 ParameterOverride,我不确定如何使用 Unity 的解析器指定员工的 ID:

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();
}
}

我不喜欢这样,因为没有编译时检查参数名称是否正确。像这样的问题让我觉得我没有正确应用模式。任何人都可以阐明我的误解吗?

谢谢!

最佳答案

依赖注入(inject)不适用于领域模型/业务对象。主要是解析服务,即用于处理业务逻辑的类。

因此,您的人员通常使用存储库或任何其他数据访问模式加载。

所以:

  1. 你的数据访问类是使用 DI 注入(inject)的
  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
}
}

关于c# - Unity容器,解析单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14688827/

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