3

Я пытаюсь привести пример вместе с использованием Caliburn Micro на WP7 с Ninject. Все было довольно прямолинейно. Тем не менее, я зациклился на том, как запустить обход события, когда экземпляр активируется 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, и когда они активированы, мне нужно запустить активированное событие. Я посмотрел на перехват, который может быть маршрутом, но я не думаю, что динамический прокси и Linfu будут работать по телефону.

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

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

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

ответ

4

Вы на неправильной дороге. Вы не должны распространять SimpleContainer и использовать Ninject для активации экземпляров. Это означает, что вы используете контейнер IoC для получения экземпляров для другого контейнера IoC.

Вместо этого вы должны изменить Bootstrapper, чтобы использовать Ninject в качестве контейнера IoC. В Интернете имеется множество примеров, например. http://caliburnmicro.codeplex.com/discussions/230861

Чтобы использовать специальные функции телефона от IPhoneContainer, вам, скорее всего, придется поместить обертку вокруг Ninject и реализовать методы, предоставляемые этим интерфейсом.


Update

Вы можете добавить 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) 
    { 
    } 
} 

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

+0

Я реализую IPhoneContainer. Моя проблема в том, что я не уверен, как реализовать событие Действие Активировано; с Ninject. –

+0

Обновлено предоставление одного способа получения уведомления при создании объекта. –

+0

Еще лучше, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^