gpt4 book ai didi

inversion-of-control - AOP 使用 Windsor 和批量注册类

转载 作者:行者123 更新时间:2023-12-04 08:23:14 25 4
gpt4 key购买 nike

我正在尝试配置一个应用程序,以便我的控制台可以使用来自 assemblyA 的类型来允许以 AOP 样式登录。 JournalInterceptor 只会将方法调用、输入和输出参数写到日志文件或某种数据存储中。

我一次可以注册一种类型,但我想一次性注册所有类型。一旦开始,我可能会向已注册的类型添加一些过滤,但我遗漏了一些东西。

我正在尝试使用 Classes.FromAssemblyContaining 但我不确定如何获取 IRegistration 实例以调用 WindsorContainer::Register

有什么线索吗?

// otherAssembly.cs
namespace assemblyA
{
public class Foo1 { public virtual void What(){} }
public class Foo2 { public virtual void Where(){} }
}
// program.cs
namespace console
{
using assemblyA;

public class JournalInterceptor : IInterceptor {}

public class Program
{
public static void Main()
{
var container = new Castle.Windsor.WindsorContainer()
.Register(
Component.For<JournalInterceptor>().LifeStyle.Transient,
// works but can't be the best way
Component.For<Foo1>().LifeStyle.Transient
.Interceptors<JournalInterceptor>(),
Component.For<Foo2>().LifeStyle.Transient,
.Interceptors<JournalInterceptor>(),
// how do I do it this way
Classes.FromAssemblyContaining<Foo1>()
.Pick()
.LifestyleTransient()
.Interceptors<JournalInterceptor>()
);

Foo1 foo = container.Resolve<Foo1>();
}
}
}

最佳答案

实现 Pointcut .在 CaSTLe Windsor 中,这是通过实现 IModelInterceptorsSelector 接口(interface)来完成的。

它会是这样的:

public class JournalPointcut : IModelInterceptorsSelector
{
public bool HasInterceptors(ComponentModel model)
{
return true; // intercept everything - probably not a good idea, though
}

public InterceptorReference[] SelectInterceptors(
ComponentModel model, InterceptorReference[] interceptors)
{
return new[]
{
InterceptorReference.ForType<JournalInterceptor>()
}.Concat(interceptors).ToArray();
}
}

然后向容器注册Interceptor和Pointcut:

this.container.Register(Component.For<JounalInterceptor>());

this.container.Kernel.ProxyFactory.AddInterceptorSelector(new JournalPointcut());

更深入的解释,你可能想看this recording .

关于inversion-of-control - AOP 使用 Windsor 和批量注册类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713561/

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