其他分享
首页 > 其他分享> > 拦截Ninject实例激活?

拦截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