我正在使用.NET內核IOC中構建的標準。但是我需要一些AutoFac自帶的功能。我想/需要限制此項目中第三方依賴項的數量。所以希望我可以在標準的.NET Core IOC中使用類似於這種AutoFac方法的東西。.NET Core IOC RegisterAssemblyType Equivalant
builder.RegisterAssemblyTypes(assemblyhere).AsImplementedInterfaces();
這可能嗎?
我正在使用.NET內核IOC中構建的標準。但是我需要一些AutoFac自帶的功能。我想/需要限制此項目中第三方依賴項的數量。所以希望我可以在標準的.NET Core IOC中使用類似於這種AutoFac方法的東西。.NET Core IOC RegisterAssemblyType Equivalant
builder.RegisterAssemblyTypes(assemblyhere).AsImplementedInterfaces();
這可能嗎?
您可能可以實現自己的擴展方法來做這種事情,但是如果它具有您想要的功能,您也可以簡單地使用Autofac。你有這個理由嗎?爲此,您只需配置它並從ConfigureServices
返回,如here所示。
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Add other framework services
// Add Autofac
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterModule<DefaultModule>();
containerBuilder.Populate(services);
var container = containerBuilder.Build();
return new AutofacServiceProvider(container);
}
您可以輕鬆地實現自己的方法來註冊所有的組件類型爲給定的組件或設置組件的...代碼將是沿着線:
foreach (var implementationType in assemblies.SelectMany(assembly => assembly.GetTypes()).Where(type => !type.GetTypeInfo().IsAbstract))
{
foreach(var interfaceType in implementationType.GetInterfaces())
{
services.AddSingleton(interfaceType, implementationType);
}
}
代碼選擇了所有非抽象類型assemblies
,並檢索每種類型的所有接口,爲每個接口/實現對創建一個Singleton
註冊。
我寧願註冊一個顯式接口(即ICommandHandler
或類似)的所有實例,所以我想補充擴展方法以及爲少數種類如下所示的AddCommandHandlers
線我想的任何實例是註冊...
public static void AddCommandHandlers(this IServiceCollection services, params Assembly[] assemblies)
{
var serviceType = typeof(ICommandHandler);
foreach (var implementationType in assemblies.SelectMany(assembly => assembly.GetTypes()).Where(type => serviceType.IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract))
{
services.AddSingleton(serviceType, implementationType);
}
}
添加類似於ConfigureServices
services.AddCommandHandlers(DomainAssembly.Reference);
通話...
我喜歡這種做法,因爲註冊的所有跨域所有類型的面孔都會爲您的IoC容器添加大量的註冊信息......通常不是一個大問題,但在我看來更清潔。
是的,你可以使用內置的.NET Core IOC容器,使用Scrutor擴展方法。它有一些不錯的組裝掃描功能。
試試這個:
services.Scan(scan => scan
.FromAssemblies(typeof(yourassembly).GetTypeInfo().Assembly)
.AddClasses()
.AsImplementedInterfaces()
.WithScopedLifetime());
它適用於內置IOC容器上,儘管它本身不是一個內置的包(Scrutor package on Nuget):
什麼包暴露'掃描?很不錯,如果這現在存在... –
我的錯誤,這是一套名爲Scrutor的軟件包提供的擴展方法https://www.nuget.org/packages/Scrutor/ –
感謝您的答覆。我正在嘗試構建一個沒有任何非MS依賴項的應用程序。但如果這是不可能的,我想我必須去Autofac。 – leen3o