2

ASP.Net MVC アプリケーションを作成するときに、何度か疑問に思ったことがあります。複数の顧客に展開したい 1 つのアプリケーションがあるとします。アプリケーション コードは同じですが、web.config の appSettings タグの configSource を変更するだけでさまざまな顧客に展開できるように、顧客ごとに 1 つの appSettings.config ファイルを使用できるようにする必要があります (少し簡略化された、 それでも)。

次に、appSettings.config のコンテンツの 50% がすべての顧客に共通であり、50% だけが顧客に依存していることに気付きます。すべての appSettings ファイルにエントリが重複している可能性があります。これは、構成にアプリケーション全体の変更を加えたい場合は、それらすべてを更新することを覚えておく必要があるため、大きな落とし穴です。

このような場合、「ベース構成」と「顧客構成」を別々のファイルに入れることができる、ある種の階層システムが本当に欲しいです。次に、ConfigurationManager が最初に顧客構成の値をチェックするようにしたいと思います。そこで定義されていない場合は、代わりに基本構成に移動します。

ASP.Net MVC4 のすぐに使える機能を使用してこれを解決する簡単な方法は見つかりませんでした。それは終了しますか、それともデフォルトの ConfigurationManager クラスを回避する必要がありますか? 独自のクラスを作成し、ConfigurationManager.AppSettings[key] へのすべての呼び出しを独自の実装への呼び出しに置き換えることもできますが、できればそれは避けたいと思います。キャッシングなど、組み込みの ConfigurationManager が処理する基本的な機能の一部を利用できるようにしたいと考えています。

このような問題を以前に解決した人はいますか?私はそれが一般的なシナリオのように思える..

4

1 に答える 1

5

これは一般的なシナリオであり、さまざまな解決方法があります。1 つの方法は、config transformsを使用することです。や と同じようにWeb.Customer1.config、 、 などを使用できます。顧客固有の変換ファイルでは、顧客がカスタマイズしたいのみを「オーバーライド」できます。Web.Customer2.configWeb.Debug.configWeb.Release.configappSettings

さまざまな変換を作成するには、まずさまざまなプロジェクト プラットフォームを作成します。Visual Studio 構成マネージャーに移動し、ConfigurationWeb プロジェクト (またはカスタマイズされた構成設定が必要な任意のプロジェクト) の列で、ドロップダウンをクリックしてから をクリックします<New...>。新しいプロジェクト構成Customer1または任意の名前を付け、 のボックスをオンにして、そのドロップダウンからCopy settings from選択Releaseします。チェックボックスにもチェックをCreate new solution configurations入れます。

最後に、web.configファイルを右クリックして をクリックしますAdd config transform。これにより、テンプレートWeb.Customer1.configファイルが生成されます。config 変換属性appSettingsを使用して、必要に応じてオーバーライドするように編集します。次に、ソリューション ビルド構成xdt:を使用してプロジェクトを発行できます。Customer1ビルドの一環としてweb.configが変換され、web.config顧客ごとに異なるファイルが作成されます。これを使用して、さまざまな展開用にプロジェクトをカスタマイズすることもできます。つまり、db 接続文字列、smtp サーバー、文字通り XML 構成ファイル内のすべてを変更します。

最後の考えとして、各Web.Xyx.configファイルを右クリックし、プロパティを選択して、それを に設定しBuild ActionNoneください。

例:

ベース web.config

<appSettings>
    <add key="CommonProperty1" value="[for all customers]" />
    <add key="CommonProperty2" value="[for all customers]" />
    <add key="CommonProperty3" value="[for all customers]" />
    <add key="CustomProperty1" value="[for one customer]" />
    <add key="CustomProperty2" value="[for one customer]" />
    <add key="CustomProperty3" value="[for one customer]" />
<appSettings>

web.Customer1.config

<appSettings>
    <add key="CustomProperty1" value="The Ohio State University" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty2" value="Scarlet" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty3" value="Gray" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
<appSettings>

web.Customer2.config

<appSettings>
    <add key="CustomProperty1" value="Michigan University" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty2" value="Blue" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty3" value="Maize" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
<appSettings>
于 2012-11-20T15:36:18.643 に答える