2014-01-28 2 views
2

Если у вас возникли проблемы с поиском правильного ответа на этот вопрос, хотя это может быть неудачным с моей стороны для поиска правильных условий.Caliburn Micro IoC.Get

Что я хочу знать, в микросхеме caliburn с использованием IoC.Get(); возвращает ссылку на этот существующий объект, а также (я предполагаю), если нет экземпляра этого объекта, IoC создаст один

Кроме того, что, если бы я должен был создать экземпляр вручную через новый, а затем и используемый ioc. get, вернет ли тот же экземпляр, который я создал вручную или новый?

Причина, по которой я спрашиваю это, я пишу приложение WPF и im, используя IoC.Get, чтобы загрузить мои модели просмотра изначально, теперь из-за редизайна мне хотелось бы создать совершенно новый набор этих представлений , так что мой родитель ViewModel выглядит примерно так:

 public ProjectContainerViewModel() 
    { 
      _containersListModel = IoC.Get<ContainersListViewModel>(); 
      _orderedItemListModel = IoC.Get<ItemsOrderedViewModel>(); 
      _packageListModel = IoC.Get<PackagesListViewModel>(); 
    } 

Может я вместо того, чтобы создавать новые экземпляры здесь, используя _containersListModel = новый ContainersListModel(). и с тех пор получить тот же самый экземпляр с IOC?

EDIT: Я использую загрузчик нашел здесь: https://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper

который определяет контейнер, я также маркировка мои ViewModels с [Export (TypeOf (ContainersListViewModel))] в начале класса.

+0

Если вы «новый» новый экземпляр, контейнер IoC не будет знать об этом, если вы не добавите (или не измените) одно из своих привязок. Кроме того, в зависимости от привязок вы можете получить новый экземпляр для каждого вызова 'IoC.Get()' или одного и того же экземпляра снова и снова (singleton), в зависимости от способа привязки реализации. 1) Что вы используете для своего контейнера DI (например, Caliburn.Micro 'SimpleContainer' или что-то еще)? 2) Как вы создаете привязки контейнера (или разрешаете ли вы разрешать «автоматически»)? – Steve

+0

Кроме того, вы говорите, что хотите «создать совершенно новый набор этих представлений» - это не имеет ничего общего с режимами просмотра. Вы хотите создать новый набор режимов просмотра? Просто убедитесь, что контейнер IoC не возвращает одноточие, а затем просто вызовите 'IoC.Get()' еще раз, чтобы получить новый. – Steve

+0

Я использую CompositionContainer, который является частью запуска CM, а также в режимах просмотра отмечены [Export (typeof (ContainersListViewModel))]. Поэтому, чтобы ответить на ваши вопросы, я не уверен, что он сейчас делает, и именно поэтому я спрашиваю, потому что я не могу узнать :( – Ben

ответ

4

Реализация по умолчанию IoC в Caliburn Micro - это простое «новое», но IoC - это точка расширения, которую вы можете подключить (и, возможно, хотите) свой собственный контейнер IoC. Для того, чтобы сделать это, вы должны переопределить следующие функции в вашем загрузчике:

  protected virtual void BuildUp(object instance); 

     protected virtual object GetInstance(Type service, string key); 

И записать их, чтобы построить объект, используя свой предпочтительный контейнер IoC. Даже если вы считаете, что вам не нужен контейнер IoC на первых шагах, вызов IoC.Get для создания вашего объекта сделает ваш код более легким для переноса в будущем.

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