2017-08-31 13 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ファイルがあります:私はGlobalSettingsに到達するにはどうすればよい

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; 

     )}; 

    } 

:私はのようなものを持っているYupii.Games.Apiで

"MongoDBCollections": { 
"Collections": [ 
    { "Monster": "monsters" }, 
    { "User": "users" } 
    ... 
]} 

services.Configure<GlobalSettings>(options => 
     { 
      options.Collections = CollectionsConfiguration.GetSection("MongoDBItems:Collections").Get<Dictionary<string, string>>(); 
     });  

次にループ:.json - - > "MongoDBCollections">コレクションは、[]サービスのためにも持っています准コレクション名を取得する:

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を示すことができる場合。
私はYupii.Games.Web方法の一つではUPDATE

...私はすべてが明らかであると思いますのVisual Studio 2017のasp.netコア2.0
を使用していますが、呼び出しを行うこの方法:

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

ちょっと不思議なことに、なぜあなたがアプリケーションで読んでいる 'appSetting.json'ではなく、GlobalSetting.jsonを使っているのですか?また、Webはあなたのスタートアッププロジェクトと仮定します。なぜなら、あなたの 'startup.cs'がウェブまたはapiにあるとしてファイルを置くのです。 – Jaya

+0

したがって、MongoDBCollectionsをYupii.Games.Api appSettings.jsonに配置すると、ユピー。ゲーム。ウェブ? appSettings.json(WebとApi)の両方でMongoDBCollection json要素を繰り返す必要はありません。私はHttpClientと電話をかけるXamarinも持っています。 – yupii7

+0

正確にそれを必要とするプロジェクトですか?私はそれがWebアプリの権利だと思いますか? - そのプロジェクトに配置し、startup.csにファイルを読み込んでコレクションをループすると、あなたのWebはapi – Jaya

答えて

0

- > 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(); 
    } 

JSONファイルがYupii.Games(クラスライブラリ)にある両方GlobalSettingsを。

私はプロパティを追加します。

public IConfiguration GlobalSettingsConfiguration { get; } 

はその後ConfigureServicesに:

 services.Configure<MongoDbSettings>(options => 
     { 
      ... 
      options.Collections = GlobalSettingsConfiguration.GetSection("MongoDBItems:Collections").Get<Dictionary<string, string>>();  
     }); 

MongoDBSettingsクラスコレクションプロパティを持っていませんが、Yupii.Gamesプロジェクト

でGlobalSettings.csを継承ループする前に:

"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私はあなたの特定の問題を理解しようとしましたが、何度かあなたの質問を読んだ後、私はまだあなたが必要としたものが何かを確信していませんでした。 Yupii.Games.Apiで

+0

その行は、私が不規則なもの(行列 - >行列)を考慮したいので、私の古い行でした。申し訳ありませんが、それは明確ではないが、私は一瞬で解決策を見ています...もう一度ありがとう! – yupii7