2017-08-31 46 views
0

我有很多項目的解決方案:
Yupii.Games -> Class Library where settings, utilities are shared with projects Yupii.Games.Web -> Web app Yupii.Games.Api -> Web apiGloabal JSON文件有許多項目共享在一個解決方案(asp.net 2.0核心)

我使用的MongoDB數據庫和我有很多收藏,但我想尊重集合名稱約定例如:
怪物(是一個實體)到怪物集合名稱。

我有一個名爲GlobalSettings.json在Yupii.Games 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 - > 「MongoDBCollections」 - >集合[]爲具有也爲服務:

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 2.0核心
我希望一切都清楚了...
UPDATE
在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

只是好奇 - 爲什麼使用GlobalSetting.json而不是應用程序正在讀取的'appSetting.json'?另外我假設網絡將是你的啓動項目 - 爲什麼不把文件放在那裏作爲你的'startup.cs'駐留在網頁或api – Jaya

+0

因此,如果我把MongoDBCollections放在Yupii.Games.Api appSettings.json中,我怎樣才能達到它Yupii.Games.Web?我不想在appSettings.json(Web和Api)中重複使用MongoDBCollection json元素。我也有Xamarin使用HttpClient進行調用。 – yupii7

+0

哪個項目完全需要它?我認爲這是網絡API的權利? - 然後將其放置在該項目中,並在startup.cs中讀取文件並循環播放集合,我假設您的網絡使用api – Jaya

回答

0

在Yupii.Games.Api - > 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類沒有類別屬性,但來自GlobalSettings.cs繼承Yupii.Games項目

之前我可以循環:

"MongoDBItems": { 
"Collections": { 
    "Monster": "monsters", 
    "User": "users", 
    "Matrix": "matrices" 
} 

上點擊鼠標右鍵都GlobalSettings JSON文件 - >去性能 - >和複製到輸出目錄應該副本總是

所以,現在我可以通過集合循環:

 foreach (var collection in CollectionList) 
     { 
      if (collectionName == collection.Key) 
       return Database.GetCollection<T>(collection.Value); 
     } 

這就是它! 感謝您的幫助(@Jaya和@ BOR4):)

+0

我很佩服你對不規則複數的奉獻=) – BOR4

0

我建議你避免讀取從配置任何東西。只要有一個通用的方法,它最適合你做這個:

MongoCollection = mongoDatabase.GetCollection<T>(typeof(T).Name.ToLower() + "s"); 

這樣,你永遠不會有更新的配置,你有一個命名約定,如果你願意改變命名規則,你必須改變它的唯一1地方....

PS我試圖理解你的具體問題,但在閱讀了幾次你的問題後,我仍然不確定你到底需要什麼。

+0

這行代碼是我的舊代碼,因爲我想考慮不規則的代碼(矩陣 - >矩陣)。對不起,如果它不清楚,但我即將與解決方案一起...再次感謝! – yupii7

相關問題