Вы были на правильном пути с typeof(T)
. Единственный пропущенный вами шаг - это то, что вы можете связать список пар ключ / значение в вашем appSettings.json
с Dictionary<string, string>
в вашем GameDatabaseSettings
.
Это позволит вам искать значения конфигурации на основе имени строки, что позволяет вам настраивать сопоставления между любым generi c Type
и соответствующим именем коллекции MongoDB через ваш appSettings.json
.
Так, учитывая следующее appSettings.json
:
"GameDatabaseSettings": {
"CollectionNames": {
"Players": "Players",
"Lobbies": "Lobbies"
},
"ConnectionString": "mongodb+srv://bugbeeb:*******@csharptest-yzm6y.mongodb.net/test?retryWrites=true&w=majority",
"DatabaseName": "DiceGameDB"
}
}
Вы можете привязать к объекту настроек, например:
public class GameDatabaseSettings : IGameDatabaseSettings
{
public Dictionary<string, string> CollectionNames { get; set; }
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}
И теперь, в вашем сервисе, вы сможете сделать что-то вроде:
_collection = db.GetCollection<T>(settings.CollectionNames[typeof(T).Name]);
Конечно, вы не должны предполагать , что будет настроено правильное сопоставление, поэтому вы, вероятно, захотите написать более защитный код, подобный:
_collection = db.GetCollection<T>(
settings.CollectionNames.TryGetValue(
typeof(T).Name,
out var collectionName
)?
collectionName :
throw new ConfigurationError(
$"The ‘{typeof(T).Name}’ mapping is not configured as part of {nameof(GameDatabaseSettings)}."
)
);