5

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

对于我的示例,我创建了一个非常简单的 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();
    }
}

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

谢谢!

4

2 回答 2

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
    }
}
于 2013-02-04T14:45:28.053 回答
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 接口实现。

于 2013-02-04T14:41:04.497 回答