2011-12-28 151 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