带有数据访问层的 api 中服务的 DI 异常

问题描述 投票:0回答:0

我正在尝试使用 DI 和访问层模式复制此 https://davek.dev/crud-with-mongodb-in-c-and-net-6#heading-service-layer。所以我的项目结构是这样的:Project Structure DbAccess 有这个接口和实现的地方:

public class MongoDataAccess : IMongoDataAccess
{
    private readonly IMongoClient _client;

    public MongoDataAccess(string connectionString)
    {
        var settings = MongoClientSettings.FromConnectionString(connectionString);
        _client = new MongoClient(settings);
    }

    public IMongoCollection<T> GetCollection<T>(string databaseName, string collectionName)
    {
        return _client.GetDatabase(databaseName).GetCollection<T>(collectionName);
    }
}

在数据中,我有所有包含 CRUD 操作的集合的接口/类对,例如:

public class CyborgData : ICyborgData
{
    private readonly IMongoCollection<Cyborg> _cyborgs;

    public CyborgData(IMongoDataAccess mongoDataAccess)
    {
        _cyborgs = mongoDataAccess.GetCollection<Cyborg>("cyborgstore", "cyborgs");
    }

    public async Task CreateCyborgAsync(Cyborg cyborg) => await _cyborgs.InsertOneAsync(cyborg);

    public async Task<Cyborg> GetCyborgAsync(string id)
    {
        var results = await _cyborgs.FindAsync(c => c.Id == id);
        return await results.SingleAsync();
    }
    
    public async Task<IList<Cyborg>> GetAllCyborgAsync()
        => await _cyborgs.AsQueryable().ToListAsync();

    public async Task UpdateCyborgAsync(Cyborg cyborg)
        => await _cyborgs.FindOneAndReplaceAsync(c => c.Id == cyborg.Id, cyborg);

    public async Task DeleteCyborgAsync(string id)
        => await _cyborgs.DeleteOneAsync(c => c.Id == id);
}

然后回到 API,我要在构建中添加服务接口/实现:

public class CyborgService : ICyborgService
    {
        private readonly ICyborgData _cyborgData;

        public CyborgService(ICyborgData cyborgData)
        {
            _cyborgData = cyborgData;
        }

        public async Task CreateCyborgAsync(Cyborg cyborg)
        {
            await _cyborgData.CreateCyborgAsync(cyborg);
        }

        public async Task<Cyborg> GetCyborgAsync(string id)
            => await _cyborgData.GetCyborgAsync(id);

        public async Task<IList<Cyborg>> GetAllCyborgAsync()
            => await _cyborgData.GetAllCyborgAsync();

        public async Task UpdateCyborgAsync(Cyborg cyborg)
            => await _cyborgData.UpdateCyborgAsync(cyborg);

        public async Task DeleteCyborgAsync(string id)
            => await _cyborgData.DeleteCyborgAsync(id);
    }

我在 Programm.cs 中添加了我的 ConnectionAccess:

builder.Services.AddSingleton<IMongoDataAccess>(new MongoDataAccess("connection string");
builder.Services.AddTransient<ICyborgService, CyborgService>();

但不是工作应用程序给了我这个长异常: System.AggregateException:'无法构建某些服务(验证服务描述符时出错'ServiceType:CyborgStoreApi.Services.ICyborgService Lifetime:Transient ImplementationType:CyborgStoreApi.Services.CyborgService':无法解析类型'DataAccess.Data的服务.ICyborgData',同时试图激活'CyborgStoreApi.Services.CyborgService'。)'

InvalidOperationException:验证服务描述符“ServiceType:CyborgStoreApi.Services.ICyborgService Lifetime:Transient ImplementationType:CyborgStoreApi.Services.CyborgService”时出错:尝试激活“CyborgStoreApi.Services”时无法解析“DataAccess.Data.ICyborgData”类型的服务.CyborgService'.

InvalidOperationException:在尝试激活“CyborgStoreApi.Services.CyborgService”时无法解析“DataAccess.Data.ICyborgData”类型的服务。

在调试器中,我看到由于某种原因我的 MongoDataAcess 没有任何实现:

Lifetime = Singleton,ServiceType = {Name = "IMongoDataAccess" FullName = "DataAccess.DbAccess.IMongoDataAccess"},ImplementationType = null

而我的 CyborgService 有。

c# mongodb asp.net-web-api dependency-injection data-access-layer
© www.soinside.com 2019 - 2024. All rights reserved.