【发布时间】:2020-04-18 17:18:20
【问题描述】:
我正在努力为我的 MongoDB 客户端创建一个基础服务。在我的 DI 容器中,我从application.json 注入了数据库连接设置(根据Microsoft’s MongoDB tutorial)。
我想不通的是基于传递给基本服务的构造函数的泛型类型来访问这些设置属性之一的最佳方法。
例如,类型 Player 的 MongoDB 集合名称被命名为 Players。我的一个想法是使用typeof(T),而不是将键/值放在设置中,但这会将集合名称与类型名称结合起来。
这里是被注入的数据库设置对象:
public class GameDatabaseSettings : IGameDatabaseSettings
{
public string PlayersCollectionName { get; set; }
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
public string LobbiesCollectionName { get; set; }
}
应用程序json:
"GameDatabaseSettings": {
"PlayersCollectionName": "Players",
"LobbiesCollectionName": "Lobbies",
"ConnectionString": "mongodb+srv://bugbeeb:*******@csharptest-yzm6y.mongodb.net/test?retryWrites=true&w=majority",
"DatabaseName": "DiceGameDB"
},
以下是基本服务的运作方式:
public interface IGameItem
{
public string Id { get; set; }
}
public class BaseService<T> where T:IGameItem
{
private readonly IMongoCollection<T> _collection;
public BaseService(IGameDatabaseSettings settings)
{
var client = new MongoClient(settings.ConnectionString);
var db = client.GetDatabase(settings.DatabaseName);
_collection = db.GetCollection<T>(settings.CollectionName); //<-- How to make this T specific??
}
public virtual async Task<T> GetAsync(string id)
{
var result = await _collection.FindAsync(item => item.Id == id);
return result.FirstOrDefault();
}
public virtual async Task DeleteAsync(string id)
{
await _collection.FindOneAndDeleteAsync(item => item.Id == id);
}
}
【问题讨论】:
标签: c# .net-core .net-core-3.1