【发布时间】:2012-11-29 23:11:03
【问题描述】:
我想为我的 Open Generic ICommandHandler 创建一个基于 T 的 keyedService。当 ICommandHandler 有一个继承自 ConsultantCommand 的 T 时,我想注册一个 ConsultatCommandHanlder 键控服务
知道怎么做吗?或者如果它甚至可能?我是 AutoFac 的新手,正在苦苦挣扎。
我目前正在像这样注册 CommandHandler:
//Register All Command Handlers
builder.RegisterAssemblyTypes(assemblies)
.As(
t =>
t.GetInterfaces()
.Where(a => a.IsClosedTypeOf(typeof (ICommandHandler<>)))
.Select(a => new KeyedService("commandHandler", a))).InstancePerHttpRequest();
如果可能的话,我猜我必须在获得 Closed Type 时识别 CommandHandlers,并以某种方式识别 Command 实现 ConsultantCommand 的那些。
我试过了:
builder.RegisterAssemblyTypes(assemblies)
.As(
t =>
t.GetInterfaces()
.Where(a => a.IsClosedTypeOf(typeof(ICommandHandler<>)) &&
a.GetGenericArguments()[0].IsSubclassOf(typeof(ConsultantCommand)))
.Select(a => new KeyedService("ConsultantCommandHandler", a))).InstancePerHttpRequest();
但不是喜悦似乎不起作用。它可以编译,但现在没有注册 CommandHandlers,即使是那些继承自 ConsultantCommand 的。我认为我的语法都是错误的
【问题讨论】:
-
您能否向我们提供更多背景信息,说明您为什么要这样做?
-
我想在成功完成之后或者可能在它们运行之前装饰某些类别的命令,以便我可以在系统中执行我们的某些操作。例如电子邮件或清除缓存
-
您尝试做的事情对于事件处理程序来说似乎更合理。命令和处理程序之间通常应该存在一一对应的关系。与其将逻辑拆分为多个命令处理程序,不如创建一个依赖于包含该逻辑的多个服务的处理程序。
-
是的。我正在使用 Udi Dahans 域事件模式。因此,如果一个人被更新,它会引发一个名为 PersonUpdated 的事件,并且事件处理程序可以监听并清除缓存发送电子邮件等。作为感兴趣的问题,Simple Injector 是否可以有条件地添加一个装饰器?顺便说一句,感谢您编写的命令文章非常有助于解释命令/处理程序模式的逻辑以及拆分给我们团队的原因。
-
不客气。 Simple Injector 拥有 IMO 对所有容器的条件装饰器的最佳支持。您可以使用
RegisterDecorator重载来接受谓词。每个封闭类型只会对谓词进行一次评估。
标签: dependency-injection inversion-of-control decorator autofac command-pattern