Зарегистрируйте все службы сразу, используя контейнер DI по умолчанию из ASP.NET 5, аналогичный Autofac.

В 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, где вы можете зарегистрировать все службы сразу?


person prashantchalise    schedule 18.02.2016    source источник


Ответы (3)


Мой вопрос: есть ли что-то подобное в контейнере DI по умолчанию из asp.net 5, где вы можете зарегистрировать все службы сразу?

Не 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());
person Kévin Chalet    schedule 18.02.2016
comment
Работает ли scrutor с .net core 2.0? Я не могу установить его с помощью nuget. - person mac10688; 25.02.2018
comment
@ mac10688 Да, должно. Он нацелен на netstandard1.0 и 1.6, которые должны работать на .NET Core 2.0. Какие проблемы вы видите? Можете ли вы зарегистрировать проблему на GitHub? - person khellang; 26.02.2018
comment
Извините, если я немного опоздал на вечеринку, но я предполагаю, что нет другого способа сделать это без пакета NuGet? Интересно, это вообще обновили? - person Horkrine; 04.10.2018

Вы по-прежнему можете использовать 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).

person vendettamit    schedule 18.02.2016

Вас может удивить, что большую часть того, что вам нужно, можно сделать в несколько строк, не полагаясь на сторонние пакеты!.. Как только кто-то еще понял, какими должны быть эти несколько строк ????

Например, вот несколько краткие расширения 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 приведены дополнительные примеры и покрывает ограничения, если вы хотите подняться на один уровень дальше.

person Alex Klaus    schedule 17.05.2021