5

apiController に次のメソッドがあります。

public IEnumerable<something> GetData(DataProvider dataProvider)
{
    return dataProvider.GetData();
}

必要なのは、JavaScript からこのメソッドを呼び出して、DataProvider 派生型のパラメーターを渡すことです。「FirstProvider」などの文字列を渡すことでこれを処理し、GetData() メソッドに N 個の if を記述して、適切な型のインスタンスを作成します。

しかし、次のような web.config ファイルに書き込む方法はありますか?

<DataProviders>
  <type = FirstDataProvider, alias = "FirstProvider">
  <type = SecondDataProvider, alias = "SecondProvider">
</DataProviders>

getData メソッドを次のように変更します。

public IEnumerable<something> GetData(string dataProviderAlias)
{
                // get provider type by it's alias from web congfig,
                // then instantiated and call: 
    return dataProvider.GetData();
}

そして、そのエイリアスで型を見つけてインスタンス化しますか?

:以下の回答を受け入れたので、正しい方向に向けられましたが、msdnはそれIConfigurationSectionHandlerが非推奨であると言います。
そこで、代わりにConfigurationSection, ConfigurationElementCollection,ConfigurationElementクラスを使用して、カスタム構成セクションを作成しました。

4

4 に答える 4

7

要素のweb.config任意のデータを保存できます。appSettings

<configuration>
   <appSettings>
      <add key="FirstAlias" value="FirstProvider" />
      <add key="SecondAlias" value="SecondProvider" />
   </appSettings>
</configuration>

そして、次を使用して値を読み取ることができます。

String firstAlias = System.Configuration.ConfigurationManager.AppSettings["FirstAlias"];
String secondAlias = System.Configuration.ConfigurationManager.AppSettings["SecondAlias"];

ビルトインです。サポートされています。カスタムデータを保存する場所です。

于 2018-04-16T18:45:48.687 に答える
6

まず、有効な xml のみを web.config に格納できます。<type = FirstDataProvider, alias = "FirstProvider">は有効な xml ではありません。

第二に、動くピースがたくさんあります。慎重に手順に従ってください -

web.config

DataProvider の適切な名前空間を入力してください。type="YOUR_APPLICATION.DataProviders" .

<configuration>
  <configSections>
    <section name="DataProviders" type="WebApplication2010.DataProviders" 
        requirePermission="false"/>
  </configSections>
  <DataProviders>
    <Provider type="FirstDataProvider" alias="FirstProvider"/>
    <Provider type="SecondDataProvider" alias="SecondProvider"/>
  </DataProviders>
  ....
</configuration>

コード

public class DataProviders : IConfigurationSectionHandler
{
    private static bool _initialized;
    public static List<Provider> _providers;

    public object Create(object parent, object configContext, XmlNode section)
    {
        XmlNodeList providers = section.SelectNodes("Provider");

        _providers = new List<Provider>();

        foreach (XmlNode provider in providers)
        {
            _providers.Add(new Provider
            {
                Type = provider.Attributes["type"].Value,
                Alias = provider.Attributes["alias"].Value,
            });
        }

        return null;
    }

    public static void Init()
    {
        if (!_initialized)
        {
            ConfigurationManager.GetSection("DataProviders");
            _initialized = true;
        }
    }

    public static IEnumerable<Provider> GetData(string dataProviderAlias)
    {
        return _providers.Where(p => p.Alias == dataProviderAlias);
    }
}

public class Provider
{
    public string Type { get; set; }
    public string Alias { get; set; }
}

Global.asax

優れた設計手法として、web.config からデータを 1 回だけ読み取り、それらを静的変数に格納する必要があります。したがって、Global.asax の Application_BeginRequest 内で初期化する必要があります。

public class Global : System.Web.HttpApplication
{
    void Application_BeginRequest(object sender, EventArgs e)
    {
        DataProviders.Init();
    }
}

使用法

var providers = DataProviders.GetData("FirstProvider").ToList();
于 2013-08-22T00:18:43.463 に答える
0

あなたが達成したいことを理解しているかどうかはわかりませんが、あなたのアイデアを実装するには、カスタム セクション ハンドラが必要です。

http://msdn.microsoft.com/en-us/library/2tw134k3(v=vs.100).aspx

特定のデータプロバイダーのデータベース接続を作成する場合は、次の同様の質問を参照してください。

ASP.NET:web.config ConnectionStringから接続を作成する方法は?

于 2013-08-21T22:48:10.010 に答える