দাবি পরিত্যাগী: গোড়ার দিকে 2015 এর হিসাবে, সেখানে আইওসি কনটেইনার একটি মহান তুলনা হয় অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে থেকে জিমি Bogard , এখানে একটি সারসংক্ষেপ হল:
ধারক পাত্রে:
- Autofac
- Ninject
- সাধারণ ইনজেক্টর
- StructureMap
- ঐক্য
- উইন্ডসর
দৃশ্যটি হ'ল: আমার একটি ইন্টারফেস রয়েছে, আইএমডিআইএটার, যাতে আমি একক অনুরোধ / প্রতিক্রিয়া বা একাধিক প্রাপকদের কাছে একটি বিজ্ঞপ্তি পাঠাতে পারি:
public interface IMediator
{
TResponse Send<TResponse>(IRequest<TResponse> request);
Task<TResponse> SendAsync<TResponse>(IAsyncRequest<TResponse> request);
void Publish<TNotification>(TNotification notification)
where TNotification : INotification;
Task PublishAsync<TNotification>(TNotification notification)
where TNotification : IAsyncNotification;
}
আমি তখন অনুরোধ / প্রতিক্রিয়া / বিজ্ঞপ্তিগুলির একটি বেস সেট তৈরি করেছি:
public class Ping : IRequest<Pong>
{
public string Message { get; set; }
}
public class Pong
{
public string Message { get; set; }
}
public class PingAsync : IAsyncRequest<Pong>
{
public string Message { get; set; }
}
public class Pinged : INotification { }
public class PingedAsync : IAsyncNotification { }
জেনেরিকের জন্য ধারক সহায়তার জন্য আমি কয়েকটি জিনিস দেখার আগ্রহী ছিলাম:
- উন্মুক্ত জেনেরিকের জন্য সেটআপ (সহজেই IRequestHandler <,> নিবন্ধন করা)
- উন্মুক্ত জেনেরিকের একাধিক নিবন্ধকরণের জন্য সেটআপ (দুই বা ততোধিক INotificationsHandlers)
জেনেরিক ভেরিয়েন্সের জন্য সেটআপ (বেস ইনোটিফিকেশন / অনুরোধ পাইপলাইন তৈরির জন্য হ্যান্ডলারের নিবন্ধকরণ) আমার হ্যান্ডলারগুলি বেশ সোজা, তারা কেবল কনসোল আউটপুট দেয়:
public class PingHandler : IRequestHandler<Ping, Pong> { /* Impl */ }
public class PingAsyncHandler : IAsyncRequestHandler<PingAsync, Pong> { /* Impl */ }
public class PingedHandler : INotificationHandler<Pinged> { /* Impl */ }
public class PingedAlsoHandler : INotificationHandler<Pinged> { /* Impl */ }
public class GenericHandler : INotificationHandler<INotification> { /* Impl */ }
public class PingedAsyncHandler : IAsyncNotificationHandler<PingedAsync> { /* Impl */ }
public class PingedAlsoAsyncHandler : IAsyncNotificationHandler<PingedAsync> { /* Impl */ }
Autofac
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterAssemblyTypes(typeof (IMediator).Assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof (Ping).Assembly).AsImplementedInterfaces();
- জেনারিকগুলি খুলুন: হ্যাঁ, স্পষ্টভাবে
- একাধিক উন্মুক্ত জেনেরিকস: হ্যাঁ, স্পষ্টভাবে
- জেনেরিক বিপরীততা: হ্যাঁ, স্পষ্টতই
Ninject
var kernel = new StandardKernel();
kernel.Components.Add<IBindingResolver, ContravariantBindingResolver>();
kernel.Bind(scan => scan.FromAssemblyContaining<IMediator>()
.SelectAllClasses()
.BindDefaultInterface());
kernel.Bind(scan => scan.FromAssemblyContaining<Ping>()
.SelectAllClasses()
.BindAllInterfaces());
kernel.Bind<TextWriter>().ToConstant(Console.Out);
- জেনারিকগুলি খুলুন: হ্যাঁ, স্পষ্টভাবে
- একাধিক উন্মুক্ত জেনেরিকস: হ্যাঁ, স্পষ্টভাবে
- জেনেরিক বিপর্যয়: হ্যাঁ, ব্যবহারকারীর দ্বারা নির্মিত এক্সটেনশনগুলি
সাধারণ ইনজেক্টর
var container = new Container();
var assemblies = GetAssemblies().ToArray();
container.Register<IMediator, Mediator>();
container.Register(typeof(IRequestHandler<,>), assemblies);
container.Register(typeof(IAsyncRequestHandler<,>), assemblies);
container.RegisterCollection(typeof(INotificationHandler<>), assemblies);
container.RegisterCollection(typeof(IAsyncNotificationHandler<>), assemblies);
- জেনারিকগুলি খুলুন: হ্যাঁ, স্পষ্টতই
- একাধিক উন্মুক্ত জেনেরিকস: হ্যাঁ, স্পষ্টতই
- জেনেরিক বিপর্যয়: হ্যাঁ, স্পষ্টতই (আপডেট 3.0 সহ)
StructureMap
var container = new Container(cfg =>
{
cfg.Scan(scanner =>
{
scanner.AssemblyContainingType<Ping>();
scanner.AssemblyContainingType<IMediator>();
scanner.WithDefaultConventions();
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
scanner.AddAllTypesOf(typeof(IAsyncRequestHandler<,>));
scanner.AddAllTypesOf(typeof(INotificationHandler<>));
scanner.AddAllTypesOf(typeof(IAsyncNotificationHandler<>));
});
});
- জেনারিকগুলি খুলুন: হ্যাঁ, স্পষ্টতই
- একাধিক উন্মুক্ত জেনেরিকস: হ্যাঁ, স্পষ্টতই
- জেনেরিক বিপরীততা: হ্যাঁ, স্পষ্টভাবে
ঐক্য
container.RegisterTypes(AllClasses.FromAssemblies(typeof(Ping).Assembly),
WithMappings.FromAllInterfaces,
GetName,
GetLifetimeManager);
/* later down */
static bool IsNotificationHandler(Type type)
{
return type.GetInterfaces().Any(x => x.IsGenericType && (x.GetGenericTypeDefinition() == typeof(INotificationHandler<>) || x.GetGenericTypeDefinition() == typeof(IAsyncNotificationHandler<>)));
}
static LifetimeManager GetLifetimeManager(Type type)
{
return IsNotificationHandler(type) ? new ContainerControlledLifetimeManager() : null;
}
static string GetName(Type type)
{
return IsNotificationHandler(type) ? string.Format("HandlerFor" + type.Name) : string.Empty;
}
- জেনারিকগুলি খুলুন: হ্যাঁ, স্পষ্টভাবে
- একাধিক উন্মুক্ত জেনেরিকস: হ্যাঁ, ব্যবহারকারীর অন্তর্নির্মিত এক্সটেনশান সহ
- জেনেরিক বিপর্যয়: ডের্প
উইন্ডসর
var container = new WindsorContainer();
container.Register(Classes.FromAssemblyContaining<IMediator>().Pick().WithServiceAllInterfaces());
container.Register(Classes.FromAssemblyContaining<Ping>().Pick().WithServiceAllInterfaces());
container.Kernel.AddHandlersFilter(new ContravariantFilter());
- জেনারিকগুলি খুলুন: হ্যাঁ, স্পষ্টভাবে
- একাধিক উন্মুক্ত জেনেরিকস: হ্যাঁ, স্পষ্টভাবে
- জেনেরিক বিপর্যয়: হ্যাঁ, ব্যবহারকারীর দ্বারা নির্মিত এক্সটেনশন with