gpt4 book ai didi

caSTLe-windsor - 使用 xml/app.config 配置 CaSTLe Windsor

转载 作者:行者123 更新时间:2023-12-04 19:03:13 24 4
gpt4 key购买 nike

我目前正在使用 CaSTLe Windsor 构建一个示例应用程序。座右铭是使用 xml/app.config 来打开/关闭方法拦截。我之前使用过 Fluent API,它很有魅力。下一步,我试图用我的 xml 替换 fluent API。

代码的要点如下:
一个名为 RandomOperations 的类,带有两个虚方法。
一个实现 IInterceptor 的 LoggingAspect 类。
实现 IModelInterceptorsSelector 的 MyInterceptorsSelector 类
一个 Program.cs 之前具有流畅的 api 语法,现在仅用于调用 RandomOperations 类的方法。
一个 app.config 有一个名为的部分,它具有注册组件的 xml 语法。

当我使用 fluent api 时,我能够拦截方法调用,但我无法使用 xml/app.config 注册来做到这一点。有人可以对遗漏的内容有所了解吗?

类(class)如下:

随机操作.cs

public class RandomOperations 
{
public virtual int MyRandomMethod(int x)
{
return x * x;
}

public virtual void Writer(string x)
{
Console.WriteLine(x);
}
}

LoggingAspect.cs
public class LoggingAspect : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("Intercepted the call to " + invocation.Method.Name);
invocation.Proceed();
Console.WriteLine("After the method call, the return value is " + invocation.ReturnValue);
}
}

MyInterceptorsSelector.cs
public class MyInterceptorsSelector : IModelInterceptorsSelector
{

public bool HasInterceptors(ComponentModel model)
{
return typeof(LoggingAspect) != model.Implementation &&
model.Implementation.Namespace.StartsWith("ConsoleApplication1") ;
}

public InterceptorReference[] SelectInterceptors(ComponentModel model, Castle.Core.InterceptorReference[] obj)
{
var interceptors = new List<InterceptorReference>(model.Interceptors.Count + 1);
foreach (InterceptorReference inter in model.Interceptors)
{
interceptors.Add(inter);
}

return interceptors.ToArray();

}
}

主要在 Program.cs
static void Main(string[] args)
{
var container = new WindsorContainer();
//container.Register(Component.For<RandomOperations>().Interceptors(typeof(LoggingAspect)));
//container.Register(Component.For<LoggingAspect>());
//container.Kernel.ProxyFactory.AddInterceptorSelector(new MyInterceptorsSelector());
var service = container.Resolve<RandomOperations>();
service.MyRandomMethod(4);
service.Writer("Hello, World");
}

删除注释掉的 fluent api 语法使应用程序正常工作。

应用配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
</configSections>

<castle>
<components>

<component id="MyInterceptorsSelector" type="MyInterceptorsSelector"/>
<component
id="LoggingAspect"
type="ConsoleApplication1.LoggingAspect, ConsoleApplication1">
</component>
<component
type="ConsoleApplication1.RandomOperations, ConsoleApplication1">
<interceptors selector="${MyInterceptorsSelector}">
<interceptor>${LoggingAspect}</interceptor>
</interceptors>
</component>

</components>
</castle>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

</configuration>

提前致谢。

最佳答案

您需要通过 IConfigurationInterpreter到您的温莎构造函数。改变:

var container = new WindsorContainer();

到:
var container = new WindsorContainer(new XmlInterpreter());
XmlInterpreter (不带参数)将从您的 app.config/web.config 中提取配置。

有关使用 IConfigurationInterpreter 的更多选项,见 docs .

关于caSTLe-windsor - 使用 xml/app.config 配置 CaSTLe Windsor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31783755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com