拦截Ninject实例激活?

时间:2011-12-28 04:07:06

标签: c# windows-phone-7 silverlight-4.0 caliburn.micro ninject-2

我试图在WP7和Ninject上使用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事件。我看了一下拦截,这可能是要走的路,但我不认为动态代理和Linfu会在手机上工作。

为了澄清更多,我没有使用SimpleContainer,上面是显示SimpleContainer在激活实例时的作用。我有一个NinjectBootstrapper和一个实现IPhoneContainer的NinjectContainer。我无法弄清楚如何使用Ninject实现event Action<object> Activated;

更新: .OnActivation()看起来像是票。

Kernel.Bind<IMyService>().To<MyService>().InSingletonScope().OnActivation();

1 个答案:

答案 0 :(得分:4)

你走错了路。您不应扩展SimpleContainer并使用Ninject来激活实例。这意味着您正在使用IoC容器来获取其他IoC容器的实例。

相反,您必须更改Bootstrapper才能将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)
    {
    }
}

顺便说一下。如果以某种方式提供最终实施,以便其他人可以利用您的工作,那将是很好的。