Structuremap، منشئ التي تأخذ على قائمة من الإضافات

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

  •  08-07-2019
  •  | 
  •  

سؤال

وحصلت على واجهة مثل هذا

public interface IWriter
{
  ...
}

وفئة

public class WriterMerger
{
  public WriterMerger(IEnumerable<IWriter> writers)
  ...
}

وأريد structuremap لملء حجة البناء على WriterMerger مع كل من IWriter مسجل. لقد سجلت في الكتاب مختلفة مع

StructureMap.ObjectFactory.Initialize(x =>
{
  x.ForRequestedType<IWriter>().AddConcreteType<MemoryWriter>();
  x.ForRequestedType<IWriter>().AddConcreteType<FlatFileWriter>();
  x.ForRequestedType<IWriter>().AddConcreteType<DbWriter>();
}

ولكن الدعوة

ObjectFactory.CreateInstance<WriterMerger>();

وإرجاع استثناء <م> "لا مثيل افتراضي المعرفة من أجل PluginFamily System.Collections.Generic.IEnumerable`1 [[IWriter ..]]" (اسم الفئة تحريرها)

وأي خدعة للقيام بذلك تلقائيا؟ أو سوف يكون لي لجعل طريقة مصنع مخصص؟

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

المحلول

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

public WriterMerger(IWriter[] writers)

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

وأنت قد تكون مهتمة ايضا في تعلم أنك يمكن تسجيل تلقائيا كل IWriters، بدلا من إدراجها صراحة. مجرد تغيير التكوين حاوية ل:

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
});

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

نصائح أخرى

وفي الواقع يمكن القيام بذلك من دون تغيير منشئ الخاص بك

وتغيير التكوين حاوية ل:

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
    x.ForRequestedType<IEnumerable<IWriter>>()
        .TheDefault.Is.ConstructedBy(x => ObjectFactory.GetAllInstances<IWriter>());
});

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

public class WriterMerger {  public WriterMerger(IWriter[] writers) }

وجوش هو على حق في التوصية أفضل طريقة لتسجيل جميع أنواع IWriter مع StructureMap. الماسحات الضوئية FTW.

وأعتقد أن هذا ما أقول لك هو أنك تحتاج إلى تعريف واحد من هذه IWriters كما الافتراضي. تخيل كانت فئة مختلفة في دالة البناء التالية:

public class Test{
  public Test(IWriter writer){}
}

وبدون تقصير IWriter انها لن تعرف أي كاتب لتعيين. لذلك ربما كنت بحاجة إلى القول الذي هو الافتراضي حتى لو كنت أبدا المستخدم ذلك. انظر في هذا المنصب:

ما الفرق بين AddConcreteType وTheDefaultIsConcreteType في StructureMap <؟ / أ>

scroll top