Gloabal Json文件与一个解决方案中的许多项目共享(asp.net core 2.0)

时间:2017-08-31 18:51:26

标签: c# json mongodb asp.net-core-2.0 asp.net-core-mvc-2.0

我有很多项目的解决方案:
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;
    }

2 个答案:

答案 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):)