В ASP.NET 5 DI уже поставляется по умолчанию, и это выглядит интересно. Я использую Autofac с MVC 5, у которого есть возможность зарегистрировать всю сборку сразу. Вот пример кода, который регистрирует все классы, оканчивающиеся на "Сервис" в Autofac.
// Autofac Configuration for API
var builder = new ContainerBuilder();
builder.RegisterModule(new ServiceModule());
...
...
builder.RegisterAssemblyTypes(Assembly.Load("IMS.Service"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
Мой вопрос: есть ли что-то подобное в контейнере DI по умолчанию из asp.net 5, где вы можете зарегистрировать все службы сразу?
Ответ 1 · рейтинг 17 · Kévin Chalet
Не OOTB, а Кристиан Хелланг создал классный пакет под названием Scrutor, который добавляет возможности сканирования сборки во встроенный контейнер. Его можно найти на NuGet.org.
services.Scan(scan => scan
.FromAssemblyOf<ITransientService>()
.AddClasses(classes => classes.AssignableTo<ITransientService>())
.AsImplementedInterfaces()
.WithTransientLifetime()
.AddClasses(classes => classes.AssignableTo<IScopedService>())
.As<IScopedService>()
.WithScopedLifetime());
Ответ 2 · рейтинг 3 · vendettamit
Вы по-прежнему можете использовать Autofac с Asp.net(5/Core) или MVC 6. Вам нужно изменить сигнатуру метода ConfigureServices, чтобы он возвращал IServiceProvider и аргумент как IServiceCollection.
E.g.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// We add MVC here instead of in ConfigureServices.
services.AddMvc();
// Create the Autofac container builder.
var builder = new ContainerBuilder();
// Add any Autofac modules or registrations.
builder.RegisterModule(new AutofacModule());
// Populate the services.
builder.Populate(services);
// Build the container.
var container = builder.Build();
// Resolve and return the service provider.
return container.Resolve<IServiceProvider>();
}
Подробнее см. здесь об интеграции Autofac с Asp.net(5/Core).
Ответ 3 · рейтинг 2 · Alex Klaus
Вас может удивить, что большую часть того, что вам нужно, можно сделать в несколько строк, не полагаясь на сторонние пакеты!.. Как только кто-то еще понял, какими должны быть эти несколько строк ????
Например, вот несколько краткие расширения DI от Autofac и NetCore.AutoRegisterDi (все методы снабжены ссылками на источники). Он позволяет вам написать логику регистрации, например (пример):
var types = typeof(BaseService<>).Assembly
.GetTypes()
.Where(t =>
!t.IsAbstract &&
t.IsClosedTypeOf(typeof(BaseService<>)))
).ToList();
services.RegisterAsImplementedInterfaces(types, ServiceLifetime.Scoped);
В этом сообщении блога проект .NET Core без Autofac приведены дополнительные примеры и покрывает ограничения, если вы хотите подняться на один уровень дальше.