以编程方式注册自定义 ASP.NET ExpressionBuilder
Registering a Custom ASP.NET ExpressionBuilder Programmatically
是否可以在应用程序启动期间以编程方式注册自定义 ExpressionBuilder
class?
等效的 web.config
声明显然是:
<system.web>
<compilation>
<expressionBuilders>
<add expressionPrefix="MyPrefix" type="MyNamespace.MyExpressionBuilder">
</expressionBuilders>
</compilation>
</system.web>
我如何在自定义 HTTP 模块 Init()
、应用程序启动或 BeginRequest
期间动态注册它而不修改 web.config
?
我找到了 ExpressionBuilderCollection Class
其中包括以下示例
class UsingExpressionBuildCollection {
static void Main(string[] args)
{
try
{
// Set the path of the config file.
string configPath = "";
// Get the Web application configuration object.
Configuration config =
WebConfigurationManager.OpenWebConfiguration(configPath);
// Get the section related object.
CompilationSection configSection =
(CompilationSection)config.GetSection("system.web/compilation");
// Display title and info.
Console.WriteLine("ASP.NET Configuration Info");
Console.WriteLine();
// Display Config details.
Console.WriteLine("File Path: {0}",
config.FilePath);
Console.WriteLine("Section Path: {0}",
configSection.SectionInformation.Name);
// Create a new ExpressionBuilder reference.
ExpressionBuilder myExpressionBuilder =
new ExpressionBuilder("myCustomExpression", "MyCustomExpressionBuilder");
// Add an ExpressionBuilder to the configuration.
configSection.ExpressionBuilders.Add(myExpressionBuilder);
// Add an ExpressionBuilder to the configuration.
ExpressionBuilder myExpressionBuilder2 =
new ExpressionBuilder("myCustomExpression2", "MyCustomExpressionBuilder2");
configSection.ExpressionBuilders.Add(myExpressionBuilder2);
// Display the ExpressionBuilder count.
Console.WriteLine("ExpressionBuilder Count: {0}",
configSection.ExpressionBuilders.Count);
// Display the ExpressionBuildersCollection details.
int i = 1;
int j = 1;
foreach (ExpressionBuilder expressionBuilder in configSection.ExpressionBuilders)
{
Console.WriteLine();
Console.WriteLine("ExpressionBuilder {0} Details:", i);
Console.WriteLine("Type: {0}", expressionBuilder.ElementInformation.Type);
Console.WriteLine("Source: {0}", expressionBuilder.ElementInformation.Source);
Console.WriteLine("LineNumber: {0}", expressionBuilder.ElementInformation.LineNumber);
Console.WriteLine("Properties Count: {0}", expressionBuilder.ElementInformation.Properties.Count);
j = 1;
foreach (PropertyInformation propertyItem in expressionBuilder.ElementInformation.Properties)
{
Console.WriteLine("Property {0} Name: {1}", j, propertyItem.Name);
Console.WriteLine("Property {0} Value: {1}", j, propertyItem.Value);
++j;
}
++i;
}
// Remove an ExpressionBuilder.
configSection.ExpressionBuilders.RemoveAt
(configSection.ExpressionBuilders.Count-1);
// Remove an ExpressionBuilder.
configSection.ExpressionBuilders.Remove("myCustomExpression");
// Update if not locked.
if (!configSection.SectionInformation.IsLocked)
{
config.Save();
Console.WriteLine("** Configuration updated.");
}
else
{
Console.WriteLine("** Could not update, section is locked.");
}
}
catch (Exception e)
{
// Unknown error.
Console.WriteLine(e.ToString());
}
// Display and wait.
Console.ReadLine();
}
}
}
重要的部分是
Configuration config =
WebConfigurationManager.OpenWebConfiguration(configPath);
// Get the section related object.
CompilationSection configSection =
(CompilationSection)config.GetSection("system.web/compilation");
//...
// Create a new ExpressionBuilder reference.
var myExpressionBuilder = new ExpressionBuilder(
expressionPrefix: "MyPrefix",
theType: "MyNamespace.MyExpressionBuilder"
);
// Add an ExpressionBuilder to the configuration.
configSection.ExpressionBuilders.Add(myExpressionBuilder);
//...
// Update if not locked.
if (!configSection.SectionInformation.IsLocked) {
config.Save();
}
以上等同于此配置示例。
<system.web>
<compilation>
<expressionBuilders>
<add expressionPrefix="MyPrefix" type="MyNamespace.MyExpressionBuilder">
</expressionBuilders>
</compilation>
</system.web>
这打开了首先搜索您的自定义构建器并在必要时添加它、检查版本等的能力。
更新解决有关修改配置文件的问题
查看 .net 参考源后,页面解析器似乎通过内部 ExpressionBuilder.GetExpressionBuilder.
直接从配置加载表达式生成器
除了目前显示的能够以编程方式注入自定义构建器的扩展点之外,我还没有找到任何其他扩展点。
另外考虑到 System.Web 的闭源性质,我怀疑将来是否会有。
是否可以在应用程序启动期间以编程方式注册自定义 ExpressionBuilder
class?
等效的 web.config
声明显然是:
<system.web>
<compilation>
<expressionBuilders>
<add expressionPrefix="MyPrefix" type="MyNamespace.MyExpressionBuilder">
</expressionBuilders>
</compilation>
</system.web>
我如何在自定义 HTTP 模块 Init()
、应用程序启动或 BeginRequest
期间动态注册它而不修改 web.config
?
我找到了 ExpressionBuilderCollection Class
其中包括以下示例
class UsingExpressionBuildCollection {
static void Main(string[] args)
{
try
{
// Set the path of the config file.
string configPath = "";
// Get the Web application configuration object.
Configuration config =
WebConfigurationManager.OpenWebConfiguration(configPath);
// Get the section related object.
CompilationSection configSection =
(CompilationSection)config.GetSection("system.web/compilation");
// Display title and info.
Console.WriteLine("ASP.NET Configuration Info");
Console.WriteLine();
// Display Config details.
Console.WriteLine("File Path: {0}",
config.FilePath);
Console.WriteLine("Section Path: {0}",
configSection.SectionInformation.Name);
// Create a new ExpressionBuilder reference.
ExpressionBuilder myExpressionBuilder =
new ExpressionBuilder("myCustomExpression", "MyCustomExpressionBuilder");
// Add an ExpressionBuilder to the configuration.
configSection.ExpressionBuilders.Add(myExpressionBuilder);
// Add an ExpressionBuilder to the configuration.
ExpressionBuilder myExpressionBuilder2 =
new ExpressionBuilder("myCustomExpression2", "MyCustomExpressionBuilder2");
configSection.ExpressionBuilders.Add(myExpressionBuilder2);
// Display the ExpressionBuilder count.
Console.WriteLine("ExpressionBuilder Count: {0}",
configSection.ExpressionBuilders.Count);
// Display the ExpressionBuildersCollection details.
int i = 1;
int j = 1;
foreach (ExpressionBuilder expressionBuilder in configSection.ExpressionBuilders)
{
Console.WriteLine();
Console.WriteLine("ExpressionBuilder {0} Details:", i);
Console.WriteLine("Type: {0}", expressionBuilder.ElementInformation.Type);
Console.WriteLine("Source: {0}", expressionBuilder.ElementInformation.Source);
Console.WriteLine("LineNumber: {0}", expressionBuilder.ElementInformation.LineNumber);
Console.WriteLine("Properties Count: {0}", expressionBuilder.ElementInformation.Properties.Count);
j = 1;
foreach (PropertyInformation propertyItem in expressionBuilder.ElementInformation.Properties)
{
Console.WriteLine("Property {0} Name: {1}", j, propertyItem.Name);
Console.WriteLine("Property {0} Value: {1}", j, propertyItem.Value);
++j;
}
++i;
}
// Remove an ExpressionBuilder.
configSection.ExpressionBuilders.RemoveAt
(configSection.ExpressionBuilders.Count-1);
// Remove an ExpressionBuilder.
configSection.ExpressionBuilders.Remove("myCustomExpression");
// Update if not locked.
if (!configSection.SectionInformation.IsLocked)
{
config.Save();
Console.WriteLine("** Configuration updated.");
}
else
{
Console.WriteLine("** Could not update, section is locked.");
}
}
catch (Exception e)
{
// Unknown error.
Console.WriteLine(e.ToString());
}
// Display and wait.
Console.ReadLine();
}
}
}
重要的部分是
Configuration config =
WebConfigurationManager.OpenWebConfiguration(configPath);
// Get the section related object.
CompilationSection configSection =
(CompilationSection)config.GetSection("system.web/compilation");
//...
// Create a new ExpressionBuilder reference.
var myExpressionBuilder = new ExpressionBuilder(
expressionPrefix: "MyPrefix",
theType: "MyNamespace.MyExpressionBuilder"
);
// Add an ExpressionBuilder to the configuration.
configSection.ExpressionBuilders.Add(myExpressionBuilder);
//...
// Update if not locked.
if (!configSection.SectionInformation.IsLocked) {
config.Save();
}
以上等同于此配置示例。
<system.web>
<compilation>
<expressionBuilders>
<add expressionPrefix="MyPrefix" type="MyNamespace.MyExpressionBuilder">
</expressionBuilders>
</compilation>
</system.web>
这打开了首先搜索您的自定义构建器并在必要时添加它、检查版本等的能力。
更新解决有关修改配置文件的问题
查看 .net 参考源后,页面解析器似乎通过内部 ExpressionBuilder.GetExpressionBuilder.
直接从配置加载表达式生成器除了目前显示的能够以编程方式注入自定义构建器的扩展点之外,我还没有找到任何其他扩展点。
另外考虑到 System.Web 的闭源性质,我怀疑将来是否会有。