2013-02-04 23 views
5

मैं एकता कंटेनर और निर्भरता इंजेक्शन के बारे में जानना शुरू कर रहा हूं। मुझे यह समझने में कठिनाई हो रही है कि मेरा ऑब्जेक्ट मॉडल कैसा दिखना चाहिए।यूनिटी कंटेनर, व्यक्तिगत ऑब्जेक्ट्स को हल करें

मेरी उदाहरण के लिए, मैं एक बहुत साधारण कर्मचारी वर्ग बनाया (मैं हटा दिया है निर्माता, क्योंकि मैं क्या बारे में उलझन में हूँ कि):

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

यह कर्मचारी ऑब्जेक्ट किसी डेटाबेस से इसकी जानकारी मिलना चाहिए ।

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

आदर्श रूप में, कर्मचारी वस्तु आदेश पता करने के लिए जो कर्मचारी डेटाबेस से प्राप्त करने के लिए एक "आईडी" पैरामीटर लेना चाहिए: यहाँ एक शिम डेटाबेस एडाप्टर सिर्फ एक निर्भरता विकसित करने के लिए है।

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 का उपयोग कर को छोड़कर एकता के रिसोल्वर के साथ कर्मचारी का आईडी निर्दिष्ट करने का तरीका नहीं कर रहा हूँ:

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. आपका डेटा का उपयोग वर्ग एक कारखाने के रूप में डि
  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

आह, ठीक है, मैं कारखाने पैटर्न का उपयोग करने से बचने की कोशिश कर रहा था क्योंकि मैंने सोचा था कि वे कुछ हद तक पारस्परिक रूप से अनन्य थे, लेकिन मुझे लगता है कि वे सब के बाद पूरक हैं। आपकी सहायताके लिए धन्यवाद! –

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

नहीं डब्ल्यू आप अपनी जरूरतों के आधार पर आईएमएमटीआई इंटरफ़ेस के विभिन्न कार्यान्वयन का उपयोग कर सकते हैं।

+0

मैं तुम्हें downvote नहीं था, लेकिन मुझे लगता है ऐसा इसलिए है क्योंकि आप कैसे मेरे सवाल का "आईडी निर्माता पैरामीटर" भाग को हल करने की व्याख्या नहीं की। यद्यपि आपके उत्तर के लिए धन्यवाद! –