0

ライブラリ プロジェクト (DataAccess) を呼び出してデータベースからデータを取得する Web プロジェクトがあります。App.config ファイル (追加 -> 新しいアイテム -> アプリケーション構成ファイル) を DataAccess プロジェクトに追加し、次のような connectionString セクションを追加しました。

<configuration>
  <connectionStrings>
    <add name="local"
        connectionString="Data Source=.\sql2008;Initial Catalog=myDB;Integrated Security=True"
        providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

DataAccess プロジェクトには、BuildConnection メソッドがあります。

internal static SqlConnection BuildConnection()
{
    string connectionString = ConfigurationManager.ConnectionStrings["local"].ToString();
    return new SqlConnection(connectionString);
}

Web プロジェクトからメソッドを呼び出すと、"ローカル" 接続文字列が存在しないことを訴える null 例外がスローされます。しばらくデバッグした後、同じ接続文字列を Web プロジェクトの Web.config に追加したところ、正常に動作するようになりました。ただし、問題は、DataAccess プロジェクトを Web プロジェクトから分離したいということです。つまり、誰が呼び出しても、DataAccess プロジェクトが独自の app.config ファイルを使用するようにしたいということです。これは可能ですか?どんな助けでも大歓迎です。

4

3 に答える 3

0

実行時には、構成ファイルは 1 つだけです。そのため、アクティブなプロジェクトの構成ファイルのみが考慮されます。また、クラス ライブラリ プロジェクトをアクティブ/スタートアップ プロジェクトとして持つことはできません。

ソリューションに 4 つのプロジェクトがあり、それぞれに構成ファイルがあるとします。アプリケーションを実行すると、アクティブなプロジェクト (スタートアップ プロジェクトであるプロジェクト) の構成ファイルのみが認識されます。

今、何ができますか?

  1. 構成ファイルのセクションを分離したいだけの場合は、各プロジェクトに構成ファイルを含めることができます。これは、メイン プロジェクトの構成で参照されます。

    Web.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
       <appSettings file="YourSettings.config">
          <add key="KeyToOverride" value="Original" />
          <add key="KeyToNotOverride" value="Standard" />
       </appSettings>
       <system.web>
            <!-- standard web settings go here -->
       </system.web>
    

    あなたの設定.config:

    <appSettings>
       <add key="KeyToOverride" value="Overridden" />
      <add key="KeyToBeAdded" value="EntirelyNew" />
    </appSettings>
    

    詳細はこちら

  2. アクティブなプロジェクト自体に個別の構成ファイルが必要な場合は、まったく別の話です。その種の醜い微調整ですが、ここでそれについて読んでください

于 2013-03-29T07:45:57.233 に答える
0

アプリケーションで使用する場合は、app.config が使用されます。アプリ構成ファイルを使用するライブラリ プロジェクトでは役に立ちません。参照ライブラリを配置しても、コードはWebサーバーになります。したがって、このタイプの分離は、セキュリティの問題には意味がありません。

しかし、物事を正しい場所に置くアプローチは正しいです。問題は、dllを参照するときに、dllプロジェクトの構成が含まれていないことです。

さらに必要な場合:) lib プロジェクトで app.config を読み取り、コード ジェネレーターを使用して public static string ConnectionString = $GeneratedCode$; などの接続文字列オブジェクトを作成します。

于 2013-03-29T07:47:22.563 に答える
0

はい、可能です。

app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="foo" value="bar"/>
  </appSettings>
</configuration>

あなたの DataAccess 層:

namespace MyApp.DataAccess
{
    public class DB
    {
        public string cfg;
        public DB()
        {
            var asmName = System.Reflection.Assembly.GetAssembly(this.GetType()).GetName().Name;
            var asmPath = System.Web.HttpContext.Current.Server.MapPath(@"bin\" + asmName + ".dll");
            var cm = ConfigurationManager.OpenExeConfiguration(asmPath);
            this.cfg = cm.AppSettings.Settings["foo"].Value;
        }
    }
}

使用方法は次のとおりです。

namespace MyApp.WebApp
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var db = new MyApp.DataAccess.DB();
            Response.Write(db.cfg);
        }
    }
}

データ アクセス プロジェクトをコンパイルするMyApp.DataAccess.dll.configと、コンテンツが生成されますapp.configMyApp.DataAccess.dll.configWeb アプリ プロジェクトにとを追加し、MyApp.DataAccess.dllに をマークCopy To Output DirectoryCopy if newerMyApp.DataAccess.dll.configください。

于 2013-03-29T08:31:53.367 に答える