gpt4 book ai didi

c# - 温莎通用装饰器

转载 作者:行者123 更新时间:2023-11-30 18:27:34 25 4
gpt4 key购买 nike

我正在尝试围绕几个非通用命令处理程序获得一个通用装饰器。如果不单独注册每个命令处理程序,这可能吗?

当前的 Windsor 命令处理程序注册(有效):

container.Register(Classes.FromAssemblyNamed(namespaceName)
.BasedOn(typeof(IDomainCommandHandler<>))
.WithService.AllInterfaces()
.LifestyleTransient());

简单的装饰器:

public class Decorator<T> : IDomainCommandHandler<T> where T : IDomainCommand
{
private readonly IDomainCommandHandler<T> _decoratedCommandHandler;

public Decorator(IDomainCommandHandler<T> decoratedCommandHandler)
{
_decoratedCommandHandler = decoratedCommandHandler;
}

public void Handle(T command)
{
_decoratedCommandHandler.Handle(command);
}
}

简单的命令/处理程序:

public class MyCommand : IDomainCommand
{

}

public class MyCommandHandler : IDomainCommandHandler<MyCommand>
{
public void Handle(MyCommand command)
{
}
}

我尝试了下面的注册,但是没有应用装饰器。

container.Register(Component.For(typeof(IDomainCommandHandler<>))
.ImplementedBy(typeof(Decorator<>))
.LifestyleTransient());

建议?

编辑:我最初忘记提及的另一个限制是,其中一些命令处理程序由两个不同的应用程序使用。一个需要装饰器,另一个不需要。

最佳答案

可能您收到“尝试解析组件时检测到依赖循环...”,对吗?这是因为装饰器的构造函数包含 IDomainCommandHandler

public Decorator(IDomainCommandHandler<T> decoratedCommandHandler)

当您尝试在 Decorator 中解析 IDomainCommandHandler 时,它会爆炸。

这里的解析链如下:

  1. 给我 IDomainCommandHandler

    //MyCommand type could be provided through a TypeFactoryComponentSelector     
    var myDecoratedCommandHandler = container.Resolve<IDomainCommandHandler<MyCommand>>();
  2. CaSTLe 解析 Decorator<> 但随后它会解析自己的依赖项

    IDomainCommandHandler<T> decoratedCommandHandler

并且因为您已经提供了 T,在本例中为 MyCommand,CaSTLe 将再次解析 Decorator,当它执行两次时 - 它放弃了。 IDomainCommandHandler 的唯一注册是 Decorator 。讨论这类问题 here .

您可以使用 DynamicProxy 实现类似“装饰器”的属性.

当你想扩展一个实现时,通常会应用装饰器模式。是这样吗?您能否举例说明您的 DomainCommandHandlers 的可能扩充?您是否正在尝试实现横切关注点?

唯一符合您风格的可能答案是实现 Typed Factory Facility使用 ITypedFactoryComponentSelector 或 FactoryMethod 并使用分辨率堆栈。然后递归遍历容器的解析栈,如果栈中有Decorator,则返回MyDomainCommandler。这看起来像是解析链的一个钩子(Hook),上面写着“现在我看到您已经在解析装饰器依赖项,所以请再次解析不是装饰器。”

关于c# - 温莎通用装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387133/

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