【问题标题】:How to store custom data in web.config?如何在 web.config 中存储自定义数据?
【发布时间】:2013-08-21 22:40:04
【问题描述】:

我的 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 已弃用。
所以我改用ConfigurationSectionConfigurationElementCollectionConfigurationElement 类来构建自定义配置部分。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 web-config


    【解决方案1】:

    您可以在web.config in the appSettings element:中存储任意数据

    <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"];
    

    它是内置的。支持。这是您应该存储自定义数据的地方。

    【讨论】:

      【解决方案2】:

      首先,web.config 中只能存储有效的 xml。 &lt;type = FirstDataProvider, alias = "FirstProvider"&gt; 不是有效的 xml。

      第二,有很多动人的部分。请仔细按照步骤操作 -

      web.config

      确保为 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; }
      }
      

      Global.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();
      

      【讨论】:

        【解决方案3】:

        好吧,我不确定我是否理解您想要实现的目标,但要实现您的想法,您需要一个自定义部分处理程序。

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

        如果您想为特定的数据提供者创建数据库连接,请参阅这个类似的问题:

        ASP.NET: How to create a connection from a web.config ConnectionString?

        【讨论】:

        • 我已经定义了一个抽象类 DataProvider 和几个派生类:FirstDataProvider、SecondDataProvider 等。我想将这些类的实例从 javascript 传递给控制器​​方法(不知道任何 DataProvider 类型:) 所以我可以只传递一个带有提供者名称的字符串,并在控制器方法中检查它是否是 firstDataProvider,第二个......等等。我只想通过名称从配置中获取 Provider 类型。
        • 好吧,你不是在谈论 .Net 数据提供者的概念。然后,按照我的第一个选项。
        【解决方案4】:

        就我而言,我需要在我的 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[] 并返回。

        【讨论】:

          猜你喜欢
          • 2010-11-22
          • 2016-08-07
          • 2011-08-26
          • 1970-01-01
          • 2015-05-03
          • 1970-01-01
          • 2019-03-18
          相关资源
          最近更新 更多