2011-12-28 189 views
3

我正试图将WP7上的Caliburn Micro与Ninject结合使用。一切都非常简单。然而,一旦实例被Ninject激活,我一直坚持如何解决事件。拦截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(); 

回答

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) 
    { 
    } 
} 

Btw。你最好能够以某种方式提供最终的实现,以便其他人可以利用你的工作。

+0

我正在实施IPhoneContainer。我的问题是,我不知道如何执行事件操作已激活;与Ninject。 – 2011-12-28 05:29:46

+0

更新给出了一种在创建对象时获取通知的方式。 – 2011-12-28 05:50:04

+0

更好,谢谢。 – 2011-12-28 05:54:42