2013-06-28 5 views
0

извлеченного из документации Caliburn Micro на EventAggregator:Вводят EventAggregator в ViewModel с Caliburn Micro

// Creating the EventAggregator as a singleton. 
public class Bootstrapper : BootstrapperBase { 
    private readonly SimpleContainer _container = 
     new SimpleContainer(); 

    // ... Other Bootstrapper Config 

    protected override void Configure(){ 
     _container.Singleton<IEventAggregator, EventAggregator>(); 
    } 

    // ... Other Bootstrapper Config 
} 

// Acquiring the EventAggregator in a viewModel. 
public class FooViewModel { 
    private readonly IEventAggregator _eventAggregator; 

    public FooViewModel(IEventAggregator eventAggregator) { 
     _eventAggregator = eventAggregator; 
    } 
} 

Таким образом, вопрос, как вы получите экземпляр EA, созданный Bootstrapper впрыснуть в ВМ?

var svm = new SomeViewModel(?);

Я попытался с помощью метода Caliburn.Micro.IoC.Get, но это не работает ...

ответ

6

Нет, вы не var svm = new SomeViewModel(?) и не использовать IoC.Get, потому что служба местоположение становится анти-шаблоном.
Шаблон, предложенный автором статьи, является наилучшей практикой, то есть вы должны вставлять свои зависимости в объекты, которые им нужны, через инъекцию конструктора.
Я не знаю, как сказать это каким-либо другим способом, но сделаю ваше приложение составным и создав для вас уровень представления.
Я бы посмотрел статью Screens, Conductors and Composition, потому что у нее есть отличные идеи, связанные с тем, что я говорю, и приложение, которое сопровождает его, является отличным.
Я бы также прочитал об инъекции зависимостей.

+1

Это был просто пример, когда вы добавляете конструктор событий IEventAggregator в конструктор ViewModel и у вас больше нет конструктора по умолчанию, вы должны передать экземпляр EA при создании экземпляра вашей виртуальной машины ... мой вопрос состоял в том, как получить экземпляр для прохождения он в конструктор VM ... –

+2

@DeanKuga Это моя точка зрения, вы не создаете модели представления вручную, вы позволяете CaliburnMicro создавать весь граф объектов для вас из загрузочного устройства, и если у вас есть ViewModel, где вы получили eventAggregator через конструктор, сохраните ссылку на него через переменную экземпляра только для чтения и используйте этот экземпляр в вашей модели ViewModel, если этому ViewModel необходимо вручную создать другие ViewModels, которые принимают IEventAggregator в своем конструкторе. –

1

Я написал статью, на которую вы ссылаетесь. Снейфер прав (пожалуйста, оставьте зеленый галочку с ним). Caliburn.Micro вкладывает значительные средства в концепцию, называемую композицией. Это означает, что весь граф объекта строится неявно во время выполнения или составлен, если хотите.

Идея заключается в том, что ваша «оболочка» ViewModel создается загрузчиком, оболочка в свою очередь создает другие ViewModels и т. Д. Вниз по графику. Это позволяет использовать конструкторскую инъекцию и обеспечивает лучшую композитоспособность.

Однако есть моменты, когда это не желаемая функциональность, для этого мы предоставляем локатор сервисов с помощью класса IoC; Как сказал Сниффер, большинство случаев использования для местоположения службы считаются анти-шаблонами, и поэтому его использование должно быть тщательно изучено, иначе оно укусит вас на заднице по дороге.

Я прикладываю последние штрихи к двум новым статьям как для IoC, так и для нашего встроенного контейнера зависимостей SimpleContainer, как только они появятся. Я добавлю соответствующие ссылки в документы EventAggregator, которые должны предоставить больше контекста вокруг сайтов инъекций и лучше практика.

+0

У вас были эти ссылки? Очень интересен «правильный» способ добавления UserControls в представление, требующее инъекции зависимостей. Новое в Caliburn.Micro. – faldeland

+0

Оба сейчас живут под EventAggregator и SimpleContainer соответственно http://caliburnmicro.codeplex.com/documentation – McDonnellDean