2017-01-23 20 views
2

我有一個接口註冊T型接口的所有執行

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核心爲此

回答

7

你可以使用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(); 
     }); 
0

添加一個參考Microsoft.Extensions.DependencyInjection.Abstractions NuGet包獲取類列表。

然後註冊一個類型。

IServiceCollection serviceCollection = new ServiceCollection(); 
serviceCollection.AddInstance<IEvent>(new ContactEvent()); 
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); 

然後要求其解決一個實例:

var myEvent = serviceProvider.GetRequiredService<IEvent>() 

也看到https://msdn.microsoft.com/en-us/magazine/mt707534.aspx?f=255&MSPPError=-2147217396

相關問題