如何注入多个依赖项(每个依赖项都在其他依赖项的内部?)- .Net Core 3.1

nimxete2  于 2022-12-27  发布在  .NET
关注(0)|答案(1)|浏览(123)

所以...这听起来可能有点愚蠢,但我现在...我目前正在做一个具有以下结构的项目
Project Structure
我得到了服务、控制器、存储库和模型...
这是控制器,我尝试示例化它的服务类。

namespace WebApi.Controllers
{
    [Route("api/usuarios")]
    [ApiController]
    public class UsuariosController : ControllerBase
    {
        private readonly IUsuariosService _service;

        public UsuariosController(IUsuariosService service)
        {
            _service = service;
            
        }

        

        // private readonly MockUsuarioRepo _repository = new MockUsuarioRepo();
        // GET: api/<ValuesController>
        [HttpGet]
        public ActionResult <IEnumerable<Usuarios>> Get()
        {
            var usuariosList = _service.GetAllUsuarios();

            return Ok(usuariosList);
        }
        
        [HttpGet]
        [Route("authenticated")]
        [Authorize]
        public string Authenticated() => String.Format("Autenticado - {0}", User.Identity.Name);

        // POST api/<ValuesController>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/<ValuesController>/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<ValuesController>/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
}

正在尝试示例化存储库

namespace Application.Services
{
    public class UsuariosService : IUsuariosService
    {
        private readonly UsuariosRepo _repository;
        public UsuariosService(UsuariosRepo repository) {
            _repository = repository;
        }
        public IEnumerable<Usuarios> GetAllUsuarios()
        {
            return _repository.GetUsuarios();
        }
        public static string GenerateToken(Usuarios usuario)
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.ASCII.GetBytes(Settings.Secret);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, usuario.Nome.ToString()),
                    new Claim(ClaimTypes.Email, usuario.Email.ToString()),
                }),
                Expires = DateTime.UtcNow.AddHours(2),
                SigningCredentials = new SigningCredentials(
                    new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature
                )
                
            };
            tokenHandler.CreateToken(tokenDescriptor);
            var token = tokenHandler.CreateToken(tokenDescriptor);
            return tokenHandler.WriteToken(token);

        }

        public Usuarios DoLogin(string username, string password, string name)
        {
            throw new NotImplementedException();
        }
    }
}

我学习了如何示例化Repos,方法是在Startup.cs上使用以下方法

public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllers();
            services.AddScoped<IUsuariosRepo, UsuariosRepo>();
            ...

但我认为服务根本没有示例化,这是我向"usuarios"发出GET请求时出现的错误。

Unable to resolve service for type 'Application.Services.Interfaces.IUsuariosService' while attempting to activate 'WebApi.Controllers.UsuariosController'.

有什么想法吗?先谢了。

pgky5nke

pgky5nke1#

代码中的第一个错误是没有在ConfigureServices中注入 IUsuariosService

services.AddScoped<IUsuariosService, UsuariosService>();

第二点你要注意的是,你没有在你的服务层使用接口,基于依赖反转原则类应该依赖于接口,所以我们必须使用接口而不是UsuariosRepo类。

private readonly IUsuariosRepo _repository;
    public UsuariosService(IUsuariosRepo repository)
    {
          _repository = repository;
    }

相关问题