我有很多项目的解决方案:
Yupii.Games -> Class Library where settings, utilities are shared with projects
Yupii.Games.Web -> Web app
Yupii.Games.Api -> Web api
我使用mongoDB作为数据库,我有很多集合,但我想尊重集合名称约定,例如:
Monster (是一个实体)怪物集合名称。
我在Yupii.Games中有一个名为GlobalSettings.json的json文件:
"MongoDBCollections": {
"Collections": [
{ "Monster": "monsters" },
{ "User": "users" }
...
]}
在Yupii.Games.Api中我有类似的东西:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MongoDbSettings>(options =>
{
options.ConnectionString = Configuration.GetSection("MongoConnection:ConnectionString").Value;
options.Database = Configuration.GetSection("MongoConnection:Database").Value;
)};
}
如何联系GlobalSettings.json - &gt; &#34; MongoDBCollections&#34; - &GT; Collections []也有一个服务:
services.Configure<GlobalSettings>(options =>
{
options.Collections = CollectionsConfiguration.GetSection("MongoDBItems:Collections").Get<Dictionary<string, string>>();
});
然后循环以获取关联集合名称:
var collectionName = typeof(T).Name;
foreach (var collection in CollectionList)
{
if (collectionName == collection.Key)
return Database.GetCollection<T>(collection.Value);
}
return Database.GetCollection<T>(collectionName);
我希望能够在Yupii.Games.Web中做同样的事情
实际上,我能够以不同的方式使每个工作正常,但代码和结构是可怕的。如果任何身体可以表现出更好和更干净的方式PLZ
我正在使用Visual Studio 2017 asp.net core 2.0
我希望一切都清楚......
的更新
在Yupii.Games.Web中,其中一个方法以这种方式调用:
HttpResponseMessage response = client.GetAsync(RESTVersion + GetCollectionName() + e).Result;
和GetCollectionName():
public string GetCollectionName()
{
string collectionName = typeof(T).Name;
... // get the collection name by associating the typeof(T)
return name;
}
答案 0 :(得分:0)
我建议你不要从配置中读取任何内容。只需要一个最适合您的通用方法:
MongoCollection = mongoDatabase.GetCollection<T>(typeof(T).Name.ToLower() + "s");
这种方式你永远不必更新配置,你有一个命名约定,如果你想改变命名约定,你只需要在一个地方改变它....
PS我试图了解你的具体问题,但经过多次阅读你的问题,我仍然不确定你到底需要什么。
答案 1 :(得分:0)
在Yupii.Games.Api中 - &gt; Startup.cs
这就是启动构造函数的样子:
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
GlobalSettingsConfiguration = new ConfigurationBuilder()
.AddJsonFile("GlobalSettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"GlobalSettings.{env.EnvironmentName}.json", optional: true)
.Build();
}
两个GlobalSettings json文件都在Yupii.Games(类库)中。
我添加了一个属性:
public IConfiguration GlobalSettingsConfiguration { get; }
然后在ConfigureServices中:
services.Configure<MongoDbSettings>(options =>
{
...
options.Collections = GlobalSettingsConfiguration.GetSection("MongoDBItems:Collections").Get<Dictionary<string, string>>();
});
MongoDBSettings类没有Collections属性,但是继承自Yupii.Games项目中的GlobalSettings.cs
在我循环之前:
"MongoDBItems": {
"Collections": {
"Monster": "monsters",
"User": "users",
"Matrix": "matrices"
}
在GlobalSettings json文件上单击右键 - &gt;转到属性 - &gt;并且复制到输出目录应该始终复制
所以现在我可以遍历这些集合:
foreach (var collection in CollectionList)
{
if (collectionName == collection.Key)
return Database.GetCollection<T>(collection.Value);
}
就是这样! 感谢帮助人(@Jaya和@ BOR4):)