我的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
类来构建自定义配置部分。
答案 0 :(得分:4)
首先,您只能在web.config中存储有效的xml。 <type = FirstDataProvider, alias = "FirstProvider">
无效xml。
其次,有很多动人的作品。请仔细按照步骤进行操作 -
确保为DataProviders输入正确的命名空间。的类型= “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; }
}
对于良好的设计实践,您只想从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();
答案 1 :(得分: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 :(得分:0)
好吧,我不确定我是否理解你想要实现的目标,但要实现你的想法,你需要一个自定义的部分处理程序。
http://msdn.microsoft.com/en-us/library/2tw134k3(v=vs.100).aspx
如果要为特定数据提供者创建数据库连接,请参阅以下类似问题:
ASP.NET: How to create a connection from a web.config ConnectionString?
答案 3 :(得分: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 []并返回。