我正在尝试使用 DI 和访问层模式复制此 https://davek.dev/crud-with-mongodb-in-c-and-net-6#heading-service-layer。所以我的项目结构是这样的: 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 有。