gpt4 book ai didi

c# - 拦截 Ninject 实例激活?

转载 作者:行者123 更新时间:2023-11-30 15:41:10 24 4
gpt4 key购买 nike

我正在尝试将在 WP7 上与 Ninject 一起使用 Caliburn Micro 的示例放在一起。一切都非常简单。但是,我一直在研究如何在实例被 Ninject 激活后触发事件。

这是 Caliburn Micro 的 SimpleContainer 中的 ActivateInstance 方法,SimpleContainer 是手机 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。我不知道如何实现 event Action<object> Activated;与 Ninject。

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

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

最佳答案

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

相反,您必须更改 Bootstrap 以使用 Ninject 作为您的 IoC 容器。网上有很多例子,例如http://caliburnmicro.codeplex.com/discussions/230861

要使用 IPhoneContainer 中的电话特定功能,您很可能还必须对 Ninject 进行包装并实现此接口(interface)提供的方法。


更新

您可以添加一个 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)
{
}
}

顺便说一句。如果您以某种方式提供最终实现,以便其他人可以利用您的工作,那就太好了。

关于c# - 拦截 Ninject 实例激活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com