- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试围绕几个非通用命令处理程序获得一个通用装饰器。如果不单独注册每个命令处理程序,这可能吗?
当前的 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
这里的解析链如下:
给我 IDomainCommandHandler
//MyCommand type could be provided through a TypeFactoryComponentSelector
var myDecoratedCommandHandler = container.Resolve<IDomainCommandHandler<MyCommand>>();
CaSTLe 解析 Decorator<> 但随后它会解析自己的依赖项
IDomainCommandHandler<T> decoratedCommandHandler
并且因为您已经提供了 T,在本例中为 MyCommand,CaSTLe 将再次解析 Decorator,当它执行两次时 - 它放弃了。 IDomainCommandHandler 的唯一注册是 Decorator
您可以使用 DynamicProxy 实现类似“装饰器”的属性.
当你想扩展一个实现时,通常会应用装饰器模式。是这样吗?您能否举例说明您的 DomainCommandHandlers 的可能扩充?您是否正在尝试实现横切关注点?
唯一符合您风格的可能答案是实现 Typed Factory Facility使用 ITypedFactoryComponentSelector 或 FactoryMethod 并使用分辨率堆栈。然后递归遍历容器的解析栈,如果栈中有Decorator,则返回MyDomainCommandler。这看起来像是解析链的一个钩子(Hook),上面写着“现在我看到您已经在解析装饰器依赖项,所以请再次解析不是装饰器。”
关于c# - 温莎通用装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387133/
所以我目前有一个主 DAO 类 ITrackingToolDAO,它包含我的每个业务实体的所有服务契约(Contract)。 public partial interface ITrackingToo
您好,已将以下组件注册到 CaSTLe Windsor 中: public class CommandDispatcher : IServiceCommandDispatcher { priv
我刚刚下载了动态对象框架Clay我遇到了关于 castle project 的问题版本。 Clay 使用“城堡”v2.0 的功能,而我有一个项目已经开始引用 v2.5。不用说只是为了让事情更有趣,我是
我在将 CaSTLe Windsor Controller Factory 与新的 RenderAction 方法结合使用时遇到了问题。我收到以下错误消息: Controller “MyControl
我试图让 Windsor 为每个请求提供一个实例 ISession,它应该被注入(inject)到所有存储库中 这是我的容器设置 container.AddFacility().Register(
我一直在尝试配置 Windsor 以根据正在构建的类为服务提供不同的实现: 我读过这个 http://docs.castleproject.org/Windsor.Registering-compon
我正在查看 ProDiner 示例 MVC 项目。我将 CaSTLe Windsor 引用从 2 更新为 3。 public static void RegisterAllFromAssemblies
我们在 Windsor 容器上使用 NoTrackingReleasePolicy,因为当我们在使用后不释放我们的组件时会发生内存泄漏。现在考虑以下问题。 一些一次性组件: public class
我是一名优秀的程序员,十分优秀!