In Caliburn.Micro作者的文档提到了这种可能性:
文档链接
IHandle继承自标记接口IHandle。这允许使用强制转换来确定对象实例是否订阅任何事件。如果您与 IoC 容器集成,这可以实现简单的自动订阅。大多数 IoC 容器(包括 SimpleContainer)都提供一个钩子,以便在创建新实例时调用。只需连接容器的回调,检查正在创建的实例以查看它是否实现了 IHandle,如果实现了,则在事件聚合器上调用 Subscribe。
Autofac 如何实现这一目标?
我尝试利用以下功能装饰者,但对于这种情况来说当然有点不合适。更重要的是,默认情况下我的实现者I句柄没有被注册为实例IHandle容器内。
P.S.提供这个improper实施以防万一它可能有任何用处,尽管我对此表示怀疑。
builder.RegisterInstance<IEventAggregator>(new EventAggregator());
builder.RegisterDecorator<IHandle>((container, handler) =>
{
var eventAggregator = container.Resolve<IEventAggregator>();
eventAggregator.Subscribe(handler);
return handler;
}, "unsubscribed", "subscribed");
对 Caliburn 的工作原理做出一些假设,我认为您正在寻找的是:
builder.RegisterType<MyViewModel>();
builder.RegisterModule<AutoSubscribeHandlersModule>();
该模块的实现类似于:
class AutoSubscribeHandersModule : Module
{
protected override AttachToComponentRegistration(
IComponentRegistry registry,
IComponentRegistration registration)
{
if (typeof(IHandle).IsAssignableFrom(registration.Activator.LimitType))
{
registration.Activated += (sender, e) => {
var aggregator = e.Context.Resolve<IEventAggregator>();
aggregator.Subscribe((IHandle)e.Instance);
};
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)