4

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

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

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

これを解決するために、最近のプロジェクトのいくつかで、設定のためだけに3番目のプロジェクトを導入しました。設定を.Settingファイルのシステムに配置します...シンプルなラッパーを使用して、さまざまな環境(開発、QA、ステージング、本番など)に対してさまざまな設定を行う機能を簡単に実現できました。

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

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

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

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

4

10 に答える 10

3

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

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

または、 ConfigurationManager.OpenExeConfigurationを使用して、任意のファイルから DAL 構成データを手動で読み込むことができます。

于 2008-11-20T17:52:51.747 に答える
2

私があなたを正しく読んでいるなら、あなたはweb.config/app.configがどのように機能するかを理解していないようです。次のような構造があるとします。

DALプロジェクト

参照:

  • いくつかのコアライブラリ
  • その他の参考文献

クラス:

  • DatabaseHelper
  • ObjectClass1
  • ObjectClass2
  • 等...

Webプロジェクト

参照:

  • いくつかのコアライブラリ
  • DALプロジェクト
  • その他の参考文献

ページ:

  • Default.aspx
  • SomePage1.aspx
  • 等...
  • 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ファイルを指定する必要があります。

于 2008-11-20T18:19:24.047 に答える
2

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

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

于 2008-11-20T18:05:07.790 に答える
1

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

于 2008-11-20T18:15:53.790 に答える
1

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

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

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

于 2008-11-20T20:45:19.870 に答える
1

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

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

于 2008-11-20T18:10:42.553 に答える
0

(Unityのような)DIフレームワークを使用している場合は、コンストラクター引数を指定できます。したがって、仮に、DALプロバイダーには、接続文字列を受け取るコンストラクターが含まれている可能性があります。

インターフェイスでコンストラクターを強制できないことは知っていますが、それは私たちが対処しなければならないことです。フレームワークには、コンストラクターの署名に暗黙の依存関係がある場所がいくつかあることを私は知っています...

于 2008-11-20T18:17:41.697 に答える
0

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

于 2008-11-20T17:54:15.503 に答える
0

DslConfigを見てください。これはあなたが探しているものを解決するようです。

于 2012-02-10T17:56:15.640 に答える