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

时间:2017-01-23 12:16:30

标签: c# dependency-injection .net-core

我有一个界面

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中执行此操作

2 个答案:

答案 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();
               });