我试图在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();
答案 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)
{
}
}
顺便说一下。如果以某种方式提供最终实施,以便其他人可以利用您的工作,那将是很好的。