Внедрение зависимостей в. net ядро ​​внутри библиотеки классов - PullRequest
0 голосов
/ 27 апреля 2020

Как я могу внедрить один класс в другой внутри. net проекта базовой библиотеки? Где я должен настроить DI, как это делается в классе StartUp ConfigureServices в проекте API?

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Существует множество мыслительных процессов для того, как вы управляете этим, так как в конце концов, вызывающий абонент должен будет зарегистрировать ваши процессы DI для вас.

Если вы посмотрите на методы, используемые Microsoft и другими, вы, как правило, будете иметь метод расширения, определенный с помощью метода, такого как «AddMyCustomLibrary», в качестве метода расширения из коллекции IServiceCollection. Здесь обсуждается .

1 голос
/ 27 апреля 2020

После долгих поисков я не смог найти исчерпывающего ответа с примером на этот вопрос. Вот что нужно сделать, чтобы использовать DI в библиотеке классов.

В вашей библиотеке:

public class TestService : ITestService
{
    private readonly ITestManager _testManager;

    public TestService(ITestManager testManager)
    {
        _testManager = testManager;
    }
}

public class TestManager : ITestManager 
{
    private readonly ITestManager _testManager;

    public TestManager()
    {
    }
}

Затем расширить IServiceCollection в библиотеке:

public static class ServiceCollectionExtensions
{
    public static void AddTest(this IServiceCollection services)
    {
        services.AddScoped<ITestManager, TestManager>();
        services.AddScoped<ITestService, TestService>();
    }
}

Наконец в запуск главного приложения (API, консоль и др. c):

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTest();
    }
0 голосов
/ 27 апреля 2020

Вы можете использовать библиотеку классов сборок Hosting Startup в качестве альтернативы для явной регистрации их в вызывающей сборке.

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/platform-specific-configuration?view=aspnetcore-3.1#class -библиотека

[assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]
namespace HostingStartupLibrary
{
    public class Startup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) => {
                services.AddSingleton<ServiceA>();
            });
        }
    }
}
...