none
Implementacion de IoC con clases internal sealed RRS feed

  • Pregunta

  • Hola! Tengo un proyecto donde me pidieron hacer un login, el proyecto esta en varias capas y tengo esto en una de mis clases:

    DLL Core uso la dll Autofac:

    internal sealed class JwtFactory : IJwtFactory
        {
            private readonly IJwtTokenHandler _jwtTokenHandler;
            private readonly JwtIssuerOptions _jwtOptions;
    
            internal JwtFactory(IJwtTokenHandler jwtTokenHandler, IOptions<JwtIssuerOptions> jwtOptions)
            {
                _jwtTokenHandler = jwtTokenHandler;
                _jwtOptions = jwtOptions.Value;
                ThrowIfInvalidOptions(_jwtOptions);
            }
    
            public async Task<AccessToken> GenerateEncodedToken(string id, string userName)
            {
            }
    
            private static ClaimsIdentity GenerateClaimsIdentity(string id, string userName)
            {
               
            }
    
            private static long ToUnixEpochDate(DateTime date)
              => (long)Math.Round((date.ToUniversalTime() -
                                   new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero))
                                  .TotalSeconds);
    
            private static void ThrowIfInvalidOptions(JwtIssuerOptions options)
            {
                
            }
        }

    Modulo en la DLL

    public class CoreModule : Module
        {
            protected override void Load(ContainerBuilder builder)
            {
                builder.RegisterType<JwtFactory>().As<IJwtFactory>().SingleInstance().FindConstructorsWith(new InternalConstructorFinder());
                builder.RegisterType<JwtTokenHandler>().As<IJwtTokenHandler>().SingleInstance().FindConstructorsWith(new InternalConstructorFinder());
                builder.RegisterType<TokenFactory>().As<ITokenFactory>().SingleInstance();
                builder.RegisterType<JwtTokenValidator>().As<IJwtTokenValidator>().SingleInstance().FindConstructorsWith(new InternalConstructorFinder());;
            }
        }
    ublic class InternalConstructorFinder : IConstructorFinder
        {
            public ConstructorInfo[] FindConstructors(Type t) => t.GetTypeInfo().DeclaredConstructors.Where(c => !c.IsPrivate && !c.IsPublic).ToArray();
        }

    Startup de mi Api (Resumido):

    public IServiceProvider ConfigureServices(IServiceCollection services)
            {
    
                //TODO: Consultar para aplicar IoC
                var builder = new ContainerBuilder();
    
                builder.RegisterModule(new CoreModule());
                builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                        .Where(t => t.Name.EndsWith("Presenter"))
                        .SingleInstance();
    
                builder.Populate(services);
                var container = builder.Build();
                return new AutofacServiceProvider(container);
            }

    Controller Api:

    public class AccountController : ControllerBase
        {
            private readonly IAccountService _user;
            private readonly IJwtFactory _jwtFactory;
            private readonly ITokenFactory _tokenFactory;
            private readonly AuthSettings _authSettings;
    
            public AccountController(IAccountService user,IJwtFactory jwtFactory, ITokenFactory tokenFactory) 
                : base()
            {
                _user = user;
                //_authSettings = authSettings;
                _jwtFactory = jwtFactory;
                _tokenFactory = tokenFactory;
            }
            
            [HttpPost]
            [Route("register")]
            public async Task<IActionResult> CreateUserAsync([FromBody] MasterUser model)
            {
                if (!ModelState.IsValid) { return BadRequest(ModelState); }
                var x = await _user.CreateAsync(model, model.PasswordHash);
    
                return Ok(x);
                
            }
    
            
        }

    IJwtFactory  estas clases me dan error de dependencia, pero no he podido resolverlo

    Si alguien tiene alguna sugerencia, seria de gran ayuda.


    • Editado jose_boliv lunes, 18 de marzo de 2019 14:06 Complemento
    lunes, 18 de marzo de 2019 14:04

Respuestas

  • Para tirar del hilo podrías mostrar el código de tu clase ? 
    JwtTokenHandler

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta jose_boliv sábado, 11 de mayo de 2019 5:01
    domingo, 24 de marzo de 2019 3:01
    Moderador

Todas las respuestas

  • Hola. Puedes mostrar el mensaje de error completo? El InnerException también por favor. 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 18 de marzo de 2019 15:40
    Moderador
  • hola

    >>IJwtFactory  estas clases me dan error de dependencia, pero no he podido resolverlo

    es un error al momento de compilar ? o en runtime

    lo pregunto para ver si es algo de la implementacion o quizas hay alguna referencia ciclica porque intentas que algun metodo de la interfaz trabaje con algun tipo de dato que no deberia

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 18 de marzo de 2019 19:00
  • Para tirar del hilo podrías mostrar el código de tu clase ? 
    JwtTokenHandler

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta jose_boliv sábado, 11 de mayo de 2019 5:01
    domingo, 24 de marzo de 2019 3:01
    Moderador