¿Cómo puedo inyectar una clase en otra dentro del proyecto de biblioteca principal de .net? ¿Dónde debo configurar DI como se hace en StartUp Class ConfigureServices en el proyecto API?

0
Dazhush 27 abr. 2020 a las 17:59

3 respuestas

La mejor respuesta

Hay muchos procesos de pensamiento sobre cómo maneja esto, ya que eventualmente, la persona que llama deberá registrar sus procesos de DI por usted.

Si observa los métodos utilizados por Microsoft y otros, normalmente tendrá un método de extensión definido con un método como "AddMyCustomLibrary" como un método de extensión fuera de IServiceCollection. Hay una discusión sobre este aquí.

2
Mitchel Sellers 27 abr. 2020 a las 15:03

Después de buscar mucho en Google, no pude encontrar una respuesta integral con un ejemplo de esta pregunta. Esto es lo que debe hacerse para usar DI en la biblioteca de clases.

En su biblioteca:

public class TestService : ITestService
{
    private readonly ITestManager _testManager;

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

public class TestManager : ITestManager 
{
    private readonly ITestManager _testManager;

    public TestManager()
    {
    }
}

Luego extienda IServiceCollection en la biblioteca:

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

Por último, en la aplicación principal StartUp (API, consola, etc.):

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTest();
    }
1
Dazhush 27 abr. 2020 a las 16:50

Puede usar la biblioteca de clases de ensamblados de inicio de hosting como alternativa para registrarlos explícitamente desde el ensamblado de llamada.

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/platform-specific-configuration?view=aspnetcore-3.1#class-library

[assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]
namespace HostingStartupLibrary
{
    public class Startup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) => {
                services.AddSingleton<ServiceA>();
            });
        }
    }
}
0
Deepak Mishra 27 abr. 2020 a las 15:20