Перехватить активацию Ninject? - PullRequest
3 голосов
/ 28 декабря 2011

Я пытаюсь собрать пример использования Caliburn Micro на WP7 с Ninject. Все было довольно просто. Тем не менее, я застрял в том, как запустить событие после активации экземпляра Ninject.

Вот метод ActivateInstance в SimpleContainer Caliburn Micro, контейнера IoC, который поставляется с CM для телефона.

 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. Я посмотрел на перехват, который мог бы стать маршрутом, но я не думаю, что динамический прокси-сервер и Линфу будет работать на телефоне.

Чтобы уточнить, я не использую SimpleContainer. Выше показано, что делает SimpleContainer, когда активируется экземпляр. У меня есть NinjectBootstrapper и NinjectContainer, который реализует IPhoneContainer. Я не могу понять, как реализовать event Action<object> Activated; с Ninject.

обновление: .OnActivation() выглядит как билет.

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

1 Ответ

4 голосов
/ 28 декабря 2011

Вы на неправильной дороге. Вы не должны расширять 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)
    {
    }
}

Btw. Было бы неплохо, чтобы вы как-то сделали финальную реализацию доступной, чтобы другие могли воспользоваться вашей работой.

...