سؤال

نظرا للتسجيلات التالية

builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();

var container = builder.Build();

إنني أتطلع إلى حل جميع مثيلات النوع الأول كـ a IEnumerable (صفيف أو مجموعة لا يهم).

في وندسور كنت قد كتبت ما يلي.

foreach(I i in container.ResolveAll<I>())
{
 ...
}

أقوم بالترحيل من Windsor إلى Autofac 1.4.4.561 ولكن لا يمكنني رؤية الصيغة المكافئة.

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

المحلول

للإصدارات الحالية من Autofac:(2.0+، أي شيء يجب أن تستخدمه اليوم)

قمت بالتسجيل متعددة ILoggers (على سبيل المثال):

var builder = new ContainerBuilder();

builder.Register<ConsoleLogger>()
  .As<ILogger>();

builder.Register<EmailLogger>()
  .As<ILogger>()
  .PreserveExistingDefaults(); //keeps console logger as the default

ثم احصل على كل شيء ILoggerس:

var loggers = container.Resolve<IEnumerable<ILogger>>();

لا تحتاج إلى القيام بأي شيء خاص، فقط اطلب IEnumerable<T> من النوع المطلوب .تتمتع Autofac بدعم المجموعة خارج الصندوق، إلى جانب خدمات أخرى محولات يمكنها تغليف مكوناتك بوظائف إضافية.

هذا هو نفس الاستخدام لما قبل 2.x ImplicitCollectionSupportModule، ولكن تم دمجه مباشرة.

للإصدارات القديمة (0.X - 1.4)

بطريقتين:

1) استخدم تسجيل المجموعة

var builder = new ContainerBuilder();
builder.RegisterCollection<ILogger>()
  .As<IEnumerable<ILogger>>();

builder.Register<ConsoleLogger>()
  .As<ILogger>()
  .MemberOf<IEnumerable<ILogger>>();

builder.Register<EmailLogger>()
  .As<ILogger>()
  .MemberOf<IEnumerable<ILogger>>();

ثم:

var loggers = container.Resolve<IEnumerable<ILogger>>();

الذي يمنحك IEnumerable.

أو 2) يمكنك استخدام وحدة ImplicitCollectionSupport ، والتي ستجعل الكود يعمل مثل الإصدارات الأحدث من Autofac:

builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;

ثم قم بحل مجموعة من ILogger بدلاً من البحث عن حل الكل.

var loggers = container.Resolve<IEnumerable<ILogger>>();

الذي يمنحك IEnumerable، مرة أخرى.

نصائح أخرى

واستكمالا لمصلحة من الإصدار الجديد (الإصدار 2.x). كل ما تحتاجه الآن هو:

container.Resolve<IEnumerable<I>>();

لم يعد هناك حاجة لRegisterCollection() أو ImplicitCollectionSupportModule - هذه الوظيفة تأتي من خارج منطقة الجزاء

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