Академический Документы
Профессиональный Документы
Культура Документы
AutoFac
Виндзор
StructureMap / Lamar
Простой инжектор
Ninject
Dryloc
services.AddScoped<IFoo, Foo>();
services.AddScoped<IBar, Bar>();
services.AddScoped<IBaz, Baz>();
services.Scan(scan =>
scan.FromCallingAssembly()
.AddClasses()
.AsMatchingInterface());
Scrutor против сторонних DI-контейнеров
Плюсы:
Минусы:
Чтобы установить Scrutor, запустите dotnet add package Scrutor из .NET CLI или
Install-Package Scrutor из консоли диспетчера пакетов. В следующем разделе
я покажу некоторые примитивы сканирования сборки, которые вы можете
использовать со Scrutor.
Итак, нам есть что обсудить, давайте представим, что у нас есть следующие
сервисы и реализации в сборке:
services.AddTransient<Service1>();
services.AddTransient<Service2>();
services.AddTransient<Service>();
services.AddTransient<Foo>();
services.AddTransient<Service1>();
services.AddTransient<Service2>();
services.AddTransient<ITransientService, TransientService>();
services.AddScoped<IScopedService, ScopedService>();
services.AddTransient<IFooSerice, TransientService>();
services.AddScoped<IScopedService, AnotherService>();
AsSelf()
AsMatchingInterface()
AsImplementedInterfaces()
AsSelfWithInterfaces()
As<>()
services.AddSingleton<TestService>();
services.AddSingleton<ITestService, TestService>();
Если класс реализует более одного интерфейса, иногда вы хотите, чтобы класс
был зарегистрирован во всех этих службах. Вы можете достичь этого с
помощью Scrutor, используя AsImplementedInterfaces() :
services.AddSingleton<ITestService, TestService>();
services.AddSingleton<IService, TestService>();
Как я уже говорил в своем последнем сообщении , важно понимать,
что эти регистрации могут привести к ошибкам, когда у вас есть
два экземпляра «синглтона». Если это не то, что вы хотите,
читайте дальше!
services.AddSingleton<TestService>();
services.AddSingleton<ITestService>(x => x.GetRequiredService<TestService
services.AddSingleton<IService>(x => x.GetRequiredService<TestService>())
services.AddSingleton<IMyService, TestService>();
Всякий раз, когда вы регистрируете класс в контейнере ASP.NET Core DI, вам
нужно указать время жизни службы. У Scrutor есть методы, соответствующие
трем временам жизни в ASP.NET Core:
.AddClasses(x=> x.InNamespaceOf<MyClass>())
.UsingRegistrationStrategy(RegistrationStrategy.Replace()) // Defau
.AsMatchingInterface()
.WithScopedLifetime()
Резюме