L'Unité De Conteneur, De Régler Les Différents Objets

Je commence à apprendre au sujet de l'Unité de Conteneur et de l'Injection de Dépendance. Je vais avoir de la difficulté à comprendre ce que mon modèle d'objet devrait ressembler.

Pour mon exemple, j'ai créé un vraiment simple Employé de la classe (j'ai omis le Constructeur, car c'est ce que je suis confus au sujet de):

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

Cet Employé objet d'obtenir les informations à partir d'une base de données. Voici une cale adaptateur de base de données, juste pour développer une dépendance:

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éalement, l'objet employé doit prendre un paramètre "id" afin de savoir ce qui l'Employé à récupérer à partir de la base de données. Disons que nous utilisons un Employé constructeur qui ressemble à ceci:

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

Je ne suis pas sûr de la façon de spécifier l'id de l'Employé avec l'Unité de résolution à l'exception de l'aide 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();
    }
}

Je n'aime pas car il n'y a aucun moment de la compilation de la vérification pour voir si le nom du paramètre est correct. Ce type de problèmes, me font penser que je suis en appliquant le modèle de manière incorrecte. Quelqu'un peut jeter un peu de lumière sur ce que je suis malentendu?

Merci!

OriginalL'auteur Vince Fedorchak | 2013-02-04