拦截Ninject实例激活?
作者:互联网
我正在尝试将Ninject在WP7上使用Caliburn Micro的示例结合在一起.一切都非常简单.但是,我坚持如何在实例被Ninject激活后如何触发事件.
这是Caliburn Micro的SimpleContainer中的ActivateInstance方法,该容器是手机CM随附的IoC容器.
protected virtual object ActivateInstance(Type type, object[] args) {
var instance = args.Length > 0 ? Activator.CreateInstance(type, args) : Activator.CreateInstance(type);
Activated(instance);
return instance;
}
我在Ninject中注册我的类型,当它们被激活时,我需要触发Activated事件.我研究了拦截可能是可行的方法,但我认为动态代理和林福不会在电话上工作.
为了澄清更多,我没有使用SimpleContainer,上面是显示激活实例时SimpleContainer的功能.我有一个实现IPhoneContainer的NinjectBootstrapper和NinjectContainer.我不知道如何实现事件Action< object>活性;与Ninject.
更新:.OnActivation()看起来像票证.
Kernel.Bind<IMyService>().To<MyService>().InSingletonScope().OnActivation();
解决方法:
您走错了路.您不应该扩展SimpleContainer并使用Ninject激活实例.这意味着您正在使用IoC容器来获取其他IoC容器的实例.
相反,您必须更改引导程序以将Ninject用作IoC容器.网络上有很多示例,例如http://caliburnmicro.codeplex.com/discussions/230861
要使用IPhoneContainer的Phone特定功能,您很可能必须在Ninject周围包装一个包装,并实现此接口提供的方法.
更新资料
您可以添加一个IActivationStrategy,如下面的代码所示.但是,如果有其他策略,请确保将其添加为最后一个策略.
this.Kernel.Components.Add<IActivationStrategy, ActivationNotificationActivationStrategy>();
this.Kernel.Components.GetAll<IActivationStrategy>()
.OfType<ActivationNotificationActivationStrategy>()
.Single().Activated += ...
public class ActivationNotificationActivationStrategy : NinjectComponent, IActivationStrategy
{
public event Action<object> Activated;
public void Activate(IContext context, InstanceReference reference)
{
if (this.Activated != null)
{
this.Activated(reference.Instance);
}
}
public void Deactivate(IContext context, InstanceReference reference)
{
}
}
顺便说一句.最好以某种方式使最终实现可用,以便其他人可以利用您的工作.
标签:ninject-2,windows-phone-7,silverlight-4-0,c,caliburn-micro 来源: https://codeday.me/bug/20191101/1986937.html