首页 > 解决方案 > 验证服务描述符时出错

问题描述

我正在尝试创建一个演示来展示 DapperExtensions 的好处。我被困在一个点上。在启动项目时,我收到有关服务类型的错误。错误 :

“某些服务无法构建(验证服务描述符时出错'ServiceType: ImOnTech.Teftis.DAL.Interfaces.DT_Inspection.ICityRepository Lifetime: Transient ImplementationType: ImOnTech.Teftis.DAL.Repositories.DT_Inspection.CityRepository': 无法在尝试激活“ImOnTech.Teftis.DAL.Repositories.DT_Inspection.CityRepository”时解析“ImOnTech.Teftis.DAL.Dapper.IDbContext”类型的服务。)(验证服务描述符“ServiceType:ImOnTech.Teftis.DAL”时出错。 IUnitOfWork 生命周期:瞬态实施类型:ImOnTech.Teftis.DAL.UnitOfWork':尝试激活“ImOnTech.Teftis.DAL.Repositories.DT_Inspection.CityRepository”时无法解析“ImOnTech.Teftis.DAL.Dapper.IDbContext”类型的服务。 )'"

DapperContext.cs

namespace ImOnTech.Teftis.DAL.Dapper
{
    public class DapperContext : IDbContext
    {
        private readonly string _connectionString;
        private IDbConnection _connection;

        private readonly IConfiguration configuration;

        public DapperContext(IConfiguration _configuration)
        {
            configuration = _configuration;
            _connectionString = configuration.GetConnectionString("DefaultConnection");
        }

        public void Dispose()
        {
            if (_connection != null && _connection.State == ConnectionState.Open)
                _connection.Close();
        }

        public IDbConnection Connection
        {
            get
            {
                if (_connection == null)
                {
                    _connection = new SqlConnection(_connectionString);
                }
                if (_connection.State != ConnectionState.Open) _connection.Open();
                return _connection;
            }
        }
    }
}

这是 CityRepository

public class CityRepository : ICityRepository
{
    public IDbContext Context { get; }
    public CityRepository(IDbContext context)
    {
        Context = context;
    }       
   

    public async Task<IReadOnlyList<City>> GetAllAsync()
    {
        var CityList = await Context.Connection.GetListAsync<City>();
        Context.Connection.Close();
        return CityList.ToList();
        // var sql = "SELECT * FROM [DT_Inspection].City";
        //using (var connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection")))
        //{
        //    connection.Open();
        //    var result = await connection.QueryAsync<City>(sql);
        //    return result.ToList();
        //}
    }

最后,CityController

 public class CityController : ControllerBase
{
    private readonly IUnitOfWork unitOfWork;
   

    private readonly ILogger<CityController> _logger;

    public CityController(ILogger<CityController> logger, IUnitOfWork unitOfWork)
    {
        _logger = logger;
        this.unitOfWork = unitOfWork;
    }
          
  
    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var data = await unitOfWork.Cities.GetAllAsync();
        return Ok(data);
    }
}

PS:

services.AddTransient<ICityRepository, CityRepository>();
        services.AddTransient<IUnitOfWork, UnitOfWork>();

我已经将它们添加到 startup.cs 但没有用。

标签: c#asp.net-core

解决方案


添加

            services.AddTransient<IDbContext, DapperContext>();

解决了这个问题。


推荐阅读