Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Criar uma Dll que tem Interfaces que não quero expor

Criei uma api que usa o Refit para acessar outras apis. O refit precisa da conficuração dos endpoinst por meio de uma interface, que nao é imprementada por nemuma outra classe. Tentei criar uma Dll que abstrai isso, expondo uma classe que recebe as interfaces por injessão de dependencia. Ao compilar nao ocorrem erros, porem, ao importar a dll para uma outra api, e executar os endpoints recebo esse erro:

System.InvalidOperationException: Unable to resolve service for type 'PolgoApi.DataAcess.Interfaces.IloginData' while attempting to activate 'PolgoApi.Controllers.LoginController'. at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) at lambda_method9(Closure , IServiceProvider , Object[] ) at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass7_0.b__0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.g__CreateController|0(ControllerContext controllerContext)

Meu program (Api que importa a Dll): 

`using PolgoApi.DataAcess.Interfaces;

var builder = WebApplication.CreateBuilder(args); // Add services to the container.

builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); }

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run(); Exemplo da interface:using PolgoApi.DTO; using PolgoApi.Model; using Refit;

namespace PolgoApi.DataAcess.Interfaces { public interface IChanceData { [Post("/{request.anoCampanha}/{requestQuery.identicicacaoCampanha}/{requestQuery.totalPorPagina}/{requestQuery.paginaAtual}")] Task GetChances([Header("Authorization")] string token, ChancesRequest requestQuery); } }`

Controller da Api que recebeu a Dll:
`using Microsoft.AspNetCore.Http;

using Microsoft.AspNetCore.Mvc; using PolgoApi.DataAcess.Interfaces; using PolgoApi.DTO; using Refit;

namespace PolgoApi.Controllers { [Route("api/[controller]")] [ApiController] public class LoginController : ControllerBase { private readonly IloginData loginData; public LoginController(IloginData loginData) { this.loginData = loginData; }

    [HttpPost]
    [Route("autenticacao")]
    public async Task<IActionResult> Autenticacao(AutenticationRequest request)
    {
        var result = await _loginData.Autentication(request).ConfigureAwait(false);
        if (result == null)
            return NotFound();
        return Ok(result);
    }
    [HttpPost]
    [Route("cadastro")]
    public async Task<IActionResult> Cadastro(CadastroRequest request)
    {
        var result = await _loginData.Cadastro(request).ConfigureAwait(false);
        if (result == null)
            return NotFound();
        return Ok(result);
    }


}

} ` As Dll suportam a injeção de dependencias? Se sim, como posso encapsular essas interfaces, de forma que as aplicações que recebem a Dll não precisem conhece-las?

1 resposta
solução!

Olá Gislaine,

Pelo erro apresentado, parece que a sua aplicação não está conseguindo encontrar a interface que você está tentando injetar na classe LoginController.

Sobre a sua pergunta, sim, as DLLs suportam injeção de dependência. Para encapsular as interfaces, você pode criar uma classe que implementa a interface e, em seguida, expor apenas essa classe na DLL. Dessa forma, a aplicação que recebe a DLL não precisará conhecer a interface, apenas a classe que você expôs.

Você pode tentar alterar sua classe que recebe as interfaces por injeção de dependência para implementar as interfaces e, em seguida, expor apenas essa classe na DLL. Algo assim:

using PolgoApi.DataAcess.Interfaces;

namespace PolgoApi.DataAcess
{
    public class LoginData : IloginData
    {
        private readonly IChanceData _chanceData;

        public LoginData(IChanceData chanceData)
        {
            _chanceData = chanceData;
        }

        public async Task<AutenticationResponse> Autentication(AutenticationRequest request)
        {
            // Implementação do método
        }

        public async Task<CadastroResponse> Cadastro(CadastroRequest request)
        {
            // Implementação do método
        }
    }
}

E então, na sua DLL, você pode expor apenas a classe LoginData.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software