نموذجية حاوية اللجنة الأولمبية الدولية استخدام مرور البيانات أسفل الخط

StackOverflow https://stackoverflow.com/questions/1612682

سؤال

لقد بدأت مؤخرا باستخدام اللجنة الأولمبية الدولية حاوية للمرة الأولى, ولكن أنا لست متعلمة على أفضل الممارسات من أجل استخدامه.أكثر specificaly أنا باستخدام الوحدة في C# .صافي المشروع و بدأت باستخدام لأنه جاء مع المنشور.

يمكنني استخدام الحاويات إلى حل "أعلى مستوى" الأشياء و الكائنات الصحيح حقن استنادا إلى الحاوية.ومع ذلك, لا أستطيع أن أرى أفضل الممارسات بوضوح عندما يكون كائن مع الأطفال الأطفال الأطفال و أريد بعض المعلومات عن اللجنة الأولمبية الدولية الحاوية على طول الطريق ، ولكن ليس في ما بين.كيف كنت عادة تنظيم استخدام الأولمبية الدولية الحاوية ؟

في البداية كنت أعتقد أنك تمرير الحاويات في كل مكان الحاجة إليها بدلا من استخراج البيانات اللازمة من الحاوية على أعلى مستوى و تمرير هذه البيانات.ولكن بعد ذلك مرة أخرى أنا على المشاكل عندما تصل إلى الكائنات الأخرى التي تأخذ بيانات محددة بالإضافة إلى حقن واجهات و كنت تفضل عدم ضخ هذه من خلال خصائص أو الحرف الأول-أساليب بعد حل الكائن.

آمل أن يكون هذا واضحا بما فيه الكفاية, ولكن دعونا ننظر خيالية (قليلا غبي..) على سبيل المثال.

class Employee
{
    private ICommands _commands; 
    priate List<Customer> _customers = new List<Customer>(); 
    public Employee(ICommands commands)
    {
        _commands = commands; 
    }
    public void AddCustomer(string customerName)
    {
        var customer = new Customer(customerName, _commands); 
        _customers.Add(customer); 
    }
}

class Customer 
{
    private string _name; 
    private ICommands _commands; 
    priate List<Case> _cases = new List<Case>(); 
    public Customer(string, name, ICommands commands)
    {
        _name = name; 
        _commands = commands; 
    }
    public void AddCase()
    {
        var case = new Case(_commands); 
        _cases.Add(case); 
    }
}

class Case    {
    private ICommands _commands; 
    public Customer(ICommands commands)
    {
        _commands = commands; 
    }
    public void TriggerCommands()
    {
        _command.TriggerSomething(); 
    }
}

إذن هذا المثال ليس له معنى كبير ، ولكن الجوهر هو نفسه ما يجب أن أفعل.يجب تطبيق بعض الأوامر لا يمر أسفل خط بلدي من خلال ViewModel الطبقات ، لأن البعض منهم بحاجة إلى أن تكون قادرة على تحريك الأوامر لعرض شيء.لدي أيضا تخزين مشتركة ، إلخ.التي قد تكون هناك حاجة بعض الفئات ولكن حاليا يتم تمريرها من خلال وتخزينها في الطبقات المتوسطة.مع فقط الأوامر أنها ليست صفقة كبيرة إذا كنت مخزن الأوامر أو حاوية ، ولكنه واحد في نموذجي IoC-استخدام تمرير الحاويات اللجنة الاولمبية الدولية بدلا من استخدام هذا حل الكائنات أسفل الخط ؟ و ماذا عن بيانات محددة مثل اسم العميل?لا يمكنك فقط تمرير هذا على حل () ، لذلك تحتاج إلى حقن هذا بعد ذلك ؟

آسف - هذا كانت قصيرة كما كنت قادرة على تحقيق ذلك.لن تتطلب إجابات من نفس الطول ;-) ..فقط.ما هو أفضل ممارسة فعل مثل هذه الاشياء مع اللجنة الأولمبية الدولية الحاويات ؟

هل كانت مفيدة؟

المحلول

ولست متأكدا تماما أن أفهم سؤالك. ولكن لا أعتقد يجب عليك ان تمرر الحاوية حولنا في كل شيء. انه من الاسهل بكثير لمجرد خلق فئة مجمع للحاوية. على سبيل المثال:

public class IoCContainer
{
  private static ContainerType = null;

  public static ContainerType Instance 
  {
    get 
    {
      if (_container == null)
      {
        string configFileName = ConfigurationManager.AppSettings[ConfigFileAppSettingName];
        _container = new WindsorContainer(new XmlInterpreter(configFileName));
      }

      return _container;
    }
  }
}

والآن استدعاء هذا في كل مكان في التعليمات البرمجية.

IoCContainer.Instance.Resolve<IAwesomeService>(); 

هل هذا مساعدتك؟

نصائح أخرى

أنا لست متأكدا مما إذا كان هذا يجيب عن سؤالك, ولكن أود أن أقول أن طريقة جيدة للعمل على تطبيق باستخدام وحدة حاوية (ينطبق أيضا على غيرها من اللجنة الاولمبية الدولية محركات أعتقد) هو:

  • تصميم الفصول الدراسية بحيث كل التبعيات هي المحدد في منشئ.بهذه الطريقة يمكنك لا تحتاج إلى صراحة التعامل مع الوحدة إلا إذا كنت بحاجة إلى إنشاء جديدة الكائنات.
  • إذا كنت بحاجة إلى إنشاء كائنات جديدة داخل الفصول الدراسية ، تمرير الوحدة الحاوية نفسها في منشئ وكذلك (كمرجع IUnityContainer), و خلق كل جديد مثيلات الكائن باستخدام Resolve الأسلوب.حتى الأشياء التي لا مسجلة و لم التبعيات ، الحاوية سوف تعطيك السليم سبيل المثال ، وبعد ذلك يمكنك أن تقرر تسجيل الأنواع التي لم تكن مسجلة سابقا دون تغيير رمز العميل.
  • أما المرور صريحة القيم إلى حل الكائنات ، يمكنك تحديد ملموسة حقن الأعضاء عند التسجيل الأنواع (انظر InjectionMembers معلمة في RegisterType الطبقة).

ويبدو أن تحتاج إلى إعلان مصانع للكيانات الخاصة بك. حل المصانع عن طريق الحقن منشئ وتمرير قيم البيانات عن طريق الأسلوب إنشاء. يجب حل كافة التبعيات الأخرى عن طريق منشئ المصنع.

هذه الإجابة .

وكنت تعريف فئة ثابتة اللجنة الاولمبية الدولية، والتي يمكن تهيئة مع حاوية معينة، وتنفيذ طرق مثل حل، حل (...)، وهذا بدوره مندوب العمل الفعلي على سبيل المثال الحاويات (عليك تخزين هذه المثال في حقل أو الممتلكات). بهذه الطريقة لم يكن لديك لتمرير أي شيء حولها، ومجرد استخدام

IoC.Resolve<SomeType>();

وفي أي مكان في التعليمات البرمجية.

وفيما يتعلق بيانات محددة: أن بعض الحاويات تأخذ معلمة وحل اعتمادا على هذه المعلمة (Autofac لديه هذا النوع من الميزة). أو يمكنك دائما إنشاء فئة مصنع التي سيكون لها طريقة يقبل مجموعة من المعلمات (مثل اسم العميل) وإرجاع مثيل كائن المقابل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top