【问题标题】:Intercept Ninject instance activation?拦截 Ninject 实例激活?
【发布时间】:2011-12-28 04:07:06
【问题描述】:

我正在尝试将 Caliburn Micro 在 WP7 上与 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();

【问题讨论】:

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


    【解决方案1】:

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

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

    要使用 IPhoneContainer 中的电话特定功能,您很可能还必须在 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)
        {
        }
    }
    

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

    【讨论】:

    • 我正在实施 IPhoneContainer。我的问题是,我不确定如何实现事件 Action Activated;使用 Ninject。
    • 更新了一种在创建对象时获取通知的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2012-11-04
    • 2013-08-21
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多