我有一个界面
public interface IEvent { }
活动类
public class ContactEvent : IEvent { }
两个事件处理程序类
public class ContactCreateHandler : IEventHandler<ContactEvent> { }
public class ContactUpdateHandler : IEventHandler<ContactEvent> { }
在.NET 4.5中,这可以使用Autofac
var assemblies = BuildManager.GetReferencedAssemblies()
.Cast<Assembly>()
.ToArray()
builder.RegisterAssemblyTypes(assemblies)
.AsClosedTypesOf(typeof(IEventHandler<>)).AsImplementedInterfaces().InstancePerRequest();
然后我会根据类型T
获取类列表var handlerList = _container.Resolve<IEnumerable<IEventHandler<T>>>();
如何在.NET Core中执行此操作
答案 0 :(得分:15)
您可以使用Scrutor。然后,您可以扫描并分配这样的处理程序:
// Automatically discover and register all message handlers...
services.Scan(
x =>
{
var entryAssembly = Assembly.GetEntryAssembly();
var referencedAssemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load);
var assemblies = new List<Assembly> { entryAssembly }.Concat(referencedAssemblies);
x.FromAssemblies(assemblies)
.AddClasses(classes => classes.AssignableTo(typeof(IEventHandler<>)))
.AsImplementedInterfaces()
.WithScopedLifetime();
});
答案 1 :(得分:0)
您可以使用Scrutor进行尝试:
所有类均按名称空间注册。在此代码中:
IEmailSenderService>名称空间=“ Identity.Core.Services”
IMailInfoFactory>名称空间=“ Identity.Core.Factories”
services.Scan(
x =>
{
var entryAssembly = Assembly.GetEntryAssembly();
var assemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load);
x.FromAssemblies(assemblies)
.AddClasses(classes => classes.InNamespaceOf(typeof(IEmailSenderService)))
.AsImplementedInterfaces()
.WithScopedLifetime()
.AddClasses(classes => classes.InNamespaceOf(typeof(IMailInfoFactory)))
.AsImplementedInterfaces()
.WithScopedLifetime();
});
或者如果要在汇编中注册所有类:
services.Scan(
x =>
{
x.FromAssembliesOf(typeof(IEmailSenderService))
.AddClasses()
.AsImplementedInterfaces()
.WithScopedLifetime();
});