web.configを使用して設定を保存する代わりの方法(複雑なソリューションの場合)

StackOverflow https://stackoverflow.com/questions/306169

質問

Webアプリケーションでは、データアクセスレイヤーを独自のプロジェクトに分離します。

これにより、設定に関連するいくつかの問題が発生します。

最終的にDALは複数のアプリケーションから消費される必要があるため、web.configは接続文字列やその他のDAL関連の設定を保持するのに適した場所ではないようです。

これを解決するために、最近のプロジェクトのいくつかで、設定専用の3つ目のプロジェクトを導入しました。 .Settingファイルのシステムに設定を配置します...シンプルなラッパーを使用すると、さまざまな環境(開発、QA、ステージング、プロダクションなど)に対して異なる設定を行うことが容易になりました。

唯一の問題は、設定プロジェクト(.Settingsクラスを含む)がアセンブリにコンパイルされるため、ビルド/展開を行わずにそれを変更することができず、一部のお客様がVisual Studioを使用しないプロジェクト。

では、これにベストプラクティスはありますか?車輪を再発明しているという感覚があります。

たとえば、独自のXML形式でサーバー上の固定ディレクトリに設定を保存するなどのソリューションがありました。ただし、ここでも、機密性の高い値の暗号化を再作成する必要はありません。そして、可能であれば、ソリューションを自己完結型に保ちたいと思います。

編集:元の質問には、web.configを使用できない(と思う)という本当に鋭い理由が含まれていませんでした...これにより、いくつかの(非常に良い)答えがコンテキストから外れます、私の悪い。

役に立ちましたか?

解決

それを分割します。 .NETの組み込みの暗号化機能で暗号化されたデータベース接続用の固定XMLストレージファイルソリューションを使用します(独自のロールバックはしないでください)。次に、結果のデータベース接続を使用して、データベースで「設定テーブル」を検索します。これにより、再デプロイせずに設定を変更できます。顧客がVisual Studioなしでデータベース接続文字列を変更できるようにする必要がある場合は、暗号化された接続文字列を生成して固定XMLストレージファイルを保存し、必要に応じて接続できる小さなWindows Formsアプリを作成するだけです(同じファイルを介して)DBにアクセスし、ユーザーの必要に応じて設定テーブルを変更します。

他のヒント

System.Configuration.ConfigurationManager.ConnectionStringsおよびSystem.Configuration.ConfigurationManager.AppSettings DALでweb.configファイルに保存されている設定を取得できるように、実行中のアプリケーションの設定を含めます。

システムでは、web.configファイルまたはDALのconsumer * .configファイルに配置するカスタム構成セクションを作成できます。これらの構成ファイルでは、デザインと場所の別の構成ファイルから読み込むように指定できます。 。 Web.Configからの外部構成ファイルの参照 方法:ConfigurationSectionを使用してカスタム構成セクションを作成する

代わりに、 ConfigurationManager.OpenExeConfiguration

app.configというweb.configファイルに相当するものを追加できます。このファイルは、コードビハインドのdllまたはexeプロジェクトの名前のファイルにコンパイルされます。これは、再コンパイルせずに完全に変更可能です。接続文字列の標準設定とキー/値ペアで定義できるさまざまなアプリ設定を使用できます。または、もう少し手間をかけると、独自のカスタム構成設定クラスとセクションを定義できます。アプリの設定で設定を参照することもできます。したがって、アプリに3つの設定(DEV、QA、PROD)を保存し、app.configファイルで実行時に必要な設定のみを参照できます。以下は、Webサービス設定用に作成された例です。

<!> lt;?xml version = <!> quot; 1.0 <!> quot; encoding = <!> quot; utf-8 <!> quot;?<!> gt;
<!> lt; configuration <!> gt;
<!> nbsp; <!> nbsp; <!> lt; configSections <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; sectionGroup name = <!> quot; applicationSettings <!> quot; type = <!> quot; System.Configuration.ApplicationSettingsGroup、System、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089 <!> quot; <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; section name = <!> quot; {Project} .Properties.Settings <!> quot; type = <!> quot; System.Configuration.ClientSettingsSection、System、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089 <!> quot; requirePermission = <!> quot; false <!> quot; / <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; / sectionGroup <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; section name = <!> quot; microsoft.web.services3 <!> quot; type = <!> quot; Microsoft.Web.Services3.Configuration.WebServicesConfiguration、Microsoft.Web.Services3、Version = 3.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35 <!> quot; / <!> gt;
<!> nbsp; <!> nbsp; <!> lt; / configSections <!> gt;
<!> nbsp; <!> nbsp; <!> lt; applicationSettings <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; {Project} .Properties.Settings <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; setting name = <!> quot; {SettingName} <!> quot ; serializeAs = <!> quot; String <!> quot; <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; value <!> gt ; {SettingValue} <!> lt; / value <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; / setting <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; / {Project} .Properties.Settings <!> gt;
<!> nbsp; <!> nbsp; <!> lt; / applicationSettings <!> gt;
<!> nbsp; <!> nbsp; <!> lt; microsoft.web.services3 <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; security <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; securityTokenManager <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; add type = <! > quot; Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager、Microsoft.Web.Services3、Version = 3.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35 <!> quot; namespace = <!> quot; http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd <!> amp; quot ; localName = <!> quot; UsernameToken <!> quot; / <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; / securityTokenManager <!> gt;
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> lt; / security <!> gt;
<!> nbsp; <!> nbsp; <!> lt; /microsoft.web.services3 <!> gt;
<!> lt; / configuration <!> gt;

私があなたを正しく読んでいるのなら、web.config / app.configの動作を理解していないようです。次のような構造を持っているとしましょう:

DALプロジェクト

参照:

  • 一部のコアライブラリ
  • その他の参照

クラス:

  • DatabaseHelper
  • ObjectClass1
  • ObjectClass2
  • etc ...

Webプロジェクト

参照:

  • 一部のコアライブラリ
  • DALプロジェクト
  • その他の参照

ページ:

  • Default.aspx
  • SomePage1.aspx
  • etc ...
  • Web.config

DatabaseHelperクラスでは、次のように接続文字列を参照できます。

string connString = ConfigurationManager
  .ConnectionStrings["myConnString"]
  .ConnectionString;

これが実行時に発生すると、DatabaseHelperクラスはWebページと同じアプリドメインで実行されるため、ConfigurationManagerの呼び出しはWebプロジェクトが提供するweb.configファイルからリクエストを読み込みます。

したがって、web / console / winforms / etc ...プロジェクトに必要な設定ファイルは1つだけであり、クラスライブラリプロジェクトごとに設計時に1つの設定ファイルを用意する必要はありません。

実際にサービスまたは別のコンソールアプリケーションなどとしてDALを実行する場合は、DALプロジェクトに独自のapp.config / web.configファイルを与える必要があります。

まったく異なるアプローチは、 SQLite を使用して、すべてのアプリケーション設定をそこに保存することです。アプリケーションにとって重要な場合は、問題のデータベースをパスワードで保護できます。また、データを保存するための簡単なプロパティ/値テーブルを作成できます。

SQLite ADOアダプターを使用すると、設定にアクセスするためにプロジェクトに追加のDLLが1つだけ必要になります。 SQLite DB自体は、Visual Studioを使用したくない人にアクセスできます。 FirefoxがSQLiteデータベースと対話するためのプラグインもあります。

設定を古いXmlファイルに保存し、XmlSerializerを使用してクラスを取得して<!> ltに変換できます。 -<!> gt; Xmlから。別の答えでは、それ。リンクされた回答は、単純なオブジェクトのリストをシリアル化しますが、1つの大きな構成オブジェクトをシリアル化することもできます。

XmlSerializerはパブリックプロパティとの間でシリアル化されるため、値の変更を許可したくない場合は、クラス自体を不変(ポップシクルスタイル)にするか、読み取り専用のファサードをデシリアライズされたもの。

これは便利なトリックです。 ConfigurationManager.AppSettings []を介して独自の構成セクションと外部ファイル参照を使用して設定するか、構成クラスごとに特定のxmlファイル名をハードコーディングすることもできます。

Config.Net - .NET開発者向けの最も簡単な構成フレームワーク

ユニットテストで完全にカバーされ、数千のサーバーおよびアプリケーションで実地テストされた、使いやすく包括的な強力な.NET構成ライブラリ。

DALで使用される設定をマッピングするインターフェイスを使用できます。その後、アプリでIoCを使用して設定をDALにフィードすることができます。

DIフレームワーク(Unityなど)を使用している場合、コンストラクター引数を指定できます。そのため、仮に、DALプロバイダーは接続文字列を受け取るコンストラクターを持つことができます。

インターフェイスでコンストラクターを強制することはできませんが、それは対処しなければならないことです。フレームワークには、コンストラクターのシグネチャに暗黙の依存関係がある場所がいくつかあることがわかっています...

DslConfig をご覧ください。これで探しているものが解決されるようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top