在.NET核心中注册所有类型T接口的实现

jon*_*ode 5 c# dependency-injection .net-core

我有一个界面

public interface IEvent { }
Run Code Online (Sandbox Code Playgroud)

一个Event类

public class ContactEvent : IEvent { }
Run Code Online (Sandbox Code Playgroud)

两个事件处理程序类

public class ContactCreateHandler : IEventHandler<ContactEvent> { }
public class ContactUpdateHandler : IEventHandler<ContactEvent> { }
Run Code Online (Sandbox Code Playgroud)

在.NET 4.5中,这可以使用Autofac

var assemblies = BuildManager.GetReferencedAssemblies()
            .Cast<Assembly>()
            .ToArray()

builder.RegisterAssemblyTypes(assemblies)
.AsClosedTypesOf(typeof(IEventHandler<>)).AsImplementedInterfaces().InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)

然后我会得到基于类型T的类列表

var handlerList = _container.Resolve<IEnumerable<IEventHandler<T>>>();
Run Code Online (Sandbox Code Playgroud)

如何在.NET Core中执行此操作

Jus*_*eno 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();
        });
Run Code Online (Sandbox Code Playgroud)