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

首先,您只能在 web.config 中存储有效的 xml。<type = FirstDataProvider, alias = "FirstProvider">不是有效的 xml。

其次,有很多动人的作品。请仔细按照步骤操作 -

网络配置

确保为 DataProviders 输入正确的命名空间。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; }
}

全球.asax

对于良好的设计实践,您只想从 web.config 读取数据一次,并将它们存储在静态变量中。因此,您要在 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 回答
0

就我而言,我需要在我的 Web.Config 文件中存储两个 byte[] 变量。因为它必须是有效的 XML 数据,所以我简单地存储了数组的内容,如下所示:

<appSettings>
    <add key="Array1" value="0,1,2,3,4,5,6,7,8,9" />
    <add key="Array2" value="0,1,2,3,4,5,6,7,8,9" />
</appSettings>

然后我调用一个函数,将其读入 C# 字符串,将其拆分为 string[],并将每个字符串元素作为一个字节解析为结果 byte[] 并返回它。

于 2019-10-15T15:28:29.683 回答