سؤال

أنا أستخدم C # مع إطار الوحدة في Microsoft. لست متأكدا تماما من كيفية حل هذه المشكلة. من المحتمل أن يكون له علاقة بفجري في فهمي مع الوحدة.

يمكن تلخيص مشكلتي باستخدام رمز المثال التالي:

class Train(Person p) { ... }

class Bus(Person p) { ... }

class Person(string name) { ... }

Person dad = new Person("joe");
Person son = new Person("timmy");

عندما أتصل بطريقة حل على الحافلة كيف يمكنني أن أتأكد من أن ابن الشخص "مع اسم" Timmy "يتم حقنه وعند حل القطار كيف يمكنني حل متأكد من حل" جو "مع اسم" جو "؟

أنا أفكر ربما استخدم الحالات المسماة؟ لكنني في حيرة. سيكون موضع تقدير أي مساعدة.

جانبا، وأفضل عدم إنشاء واجهة iPerson.

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

المحلول

طريقة واحدة لحل هذا سيكون لاستخدام منشئ الحقن مع تسجيل مسمى.

// Register timmy this way  
Person son = new Person("Timmy");  
container.RegisterInstance<Person>("son", son);  

// OR register timmy this way  
container.RegisterType<Person>("son", new InjectionConstructor("Timmy"));  

// Either way, register bus this way.  
container.RegisterType<Bus>(new InjectionConstructor(container.Resolve<Person>("son")));  

// Repeat for Joe / Train

نصائح أخرى

ما لم تسجل على التوالي "جو" و "Timmy" كصعيد تسمى، لا يمكنك التأكد من أن "Timmy" يتم حقنه في SchoolBus. في الواقع، إذا حاولت تسجيل مثيلتين من نفس الفئة مثل التبعيات لم يذكر اسمها، سيكون لديك إعداد غامض، ولن تكون قادرا على حلها Person على الاطلاق.

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

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

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

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

public class Foo
{
   IService _service;
   int _accountNumber;

   public Foo(IService service, int accountNumber)
   {
      _service = service;
      _accountNumber = accountNumber;
   }
   public void SaveAccount()
   {
       _service.Save(_accountNumber);

   }
}
public class Program
{
     public static void Main()
     {
        Foo foo = new Foo(new Service(),1234);
        foo.Save();
     }
}

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

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

public class Foo
{
   IService _service;
   public Foo(IService service)
   {
      _service = service;
   }
   public void SaveAccount(int accountNumber)
   {
       _service.Save(accountNumber);

   }
}
public class Program
{
     public static void Main()
     {
        Foo foo = new Foo(new Service());
        foo.Save(1234);
     }
}

يبدو أن كلا فصول فو تصاميم صالحة. لكن الثاني قابل للاستخدام مع حقن التبعية التلقائي، وأول ليس كذلك.

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