2012-02-17 2 views
0

Я создаю приложение WPF, используя призму и единство в качестве контейнера. Пару раз я расклеился с порядком регистрации типов, когда тип (ViewModel в конструкторе представлений) был автоматически создан Unity, когда я его не зарегистрировал. Затем я попытался зарегистрировать тип, используя ContainerControlledLifetimeManager() и подумал Я создал синглтон. Однако создание авто означает несколько экземпляров модели представления.Prism and Unity - предотвратить автоматическое создание типа

Помимо очевидного решения о том, что вы не являетесь маппетом и не выполняете вышеизложенное, существует ли способ предотвратить создание Unity автоматически незарегистрированных типов и, возможно, исключение исключения?

ответ

1

Определите интерфейс для каждой из ваших ViewModels, а затем зарегистрируйте их соответствующим образом.

public interface IViewModel 
{ 
    List<IUser> Users { get; } 
} 

public class ViewModel : IViewModel 
{ 
    List<IUser> Users { get; } 
} 

Container.RegisterType<IViewModel, ViewModel>(); 

В конструкторе убедитесь, что тип интерфейса впрыскивают, а не конкретный тип, как единство, безусловно, построить экземпляр конкретного типа, так как она разрешима; тогда как интерфейс может иметь N реализаций.

Кроме того, ваш код должен быть сконструирован таким образом, чтобы данные, которые должны существовать в приложении, должны были образовывать сервис, а не ViewModel. Создание вашей ViewModel синглтон не должно быть вашим подходом, прокси-данные через службу. таким образом, ваш ViewModel может быть построен/уничтожен по желанию, данные, которые вы хотите сохранить, существуют в другом месте.

Container.RegisterType<IService, Service>(new ContainerControlledLifetimeManager()); 
Container.RegisterType<IViewModel, ViewModel>(); 

... 

public List<IUser> Users 
{ 
    get { return Container.Resolve<IService>().GetUsers(); } 
} 
+0

Спасибо за быстрый ответ. Я вообще не беспокоился о создании интерфейсов для моделей viewmodels, поскольку я не мог видеть эту точку, поскольку они привязаны к представлениям, которым они предоставляют контекст данных. Я видел некоторые плюсы и минусы за это, но для меня это было излишним. Возможно, мне нужно переосмыслить это. Итак, нет опции конфигурации? – pilsdumps

+0

Если вы зарегистрируете данный тип; по умолчанию используется переходное время жизни. Использование 'ContainerControlledLifetimeManager', безусловно, обеспечит однопользовательское поведение, однако вы не пытаетесь сделать это с помощью ViewModel. Имейте в виду, что ViewModel можно использовать для нескольких видов. Кроме того, он позволяет вам обычным образом поменять конкретный тип для тестирования или другими способами. Единство, создающее экземпляр конкретного типа, не настраивается, что я знаю, это поведение контейнера. Пример singleton должен работать, нужен код, чтобы понять ваш пример. –

+0

Container.Resolve () - это ужасная практика! Проксирование данных через сервис - отличный совет! – aateeque

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