#c_sharp #devexpress #unity_container
Есть базовый интерфейсIViewModel для всех моих ViewModel. Все ViewModel используют DevExpress POCO механизм: public static EfCaseCollectionViewModel Create(IUnitOfWorkFactoryunitOfWorkFactory = null) { return ViewModelSource.Create(() => new EfCaseCollectionViewModel(unitOfWorkFactory)); } protected EfCaseCollectionViewModel(IUnitOfWorkFactory unitOfWorkFactory = null) : base(x => x.Cases, unitOfWorkFactory ?? UnitOfWorkSource.GetUnitOfWorkFactory(),projection:t=>t.Where(x=>x.Removed==false)) { } Во ViewModel не используется без параметрический конструктор. Unity контейнер я создаю при старте в статическом классе: UnityContainer unityContainer = new UnityContainer(); unityContainer.RegisterType ("CaseCollection"); Во View: public EfCaseCollectionView(IUnityContainer container) { this.DataContext = GetViewModel(container); InitializeComponent(); } private IViewModel GetViewModel(IUnityContainer container) { if (container.IsRegistered ("CaseCollection")) { return container.Resolve ("CaseCollection"); } return container.Resolve (); } Но без конструктора без параметров это не работает. (MissingMethodException:'System.MissingMethodException: No parameterless constructor defined for this object.). Как правильно использовать Unity в этой ситуации?
Ответы
Ответ 1
Спасибо за ссылку, помогла как пища для размышлений. Честно, часть вопроса связанная с Exception не связана с основной частью тем что я просто не уследил что в CodeBehind'е View UserControl нету конструктора без параметров. По поводу основной части. Сделал так: public static readonly UnityContainer UnityContainer = new UnityContainer(); public static void Resolve() { UnityContainer.RegisterType("CaseCollection", new InjectionFactory(c => EfCaseCollectionViewModel.Create())); } Этот метод вызывается в App.xaml.cs А в View Так: public EfCaseCollectionView() { InitializeComponent(); this.DataContext = GetViewModel(Bootstrapper.UnityContainer); } private IViewModel GetViewModel(IUnityContainer container) { if (container.IsRegistered ("CaseCollection")) { return container.Resolve ("CaseCollection"); } //if not found, get default factory return container.Resolve (); } Я не уверен что решение правильное, но мою текущую задачу оно выполнило.
Комментариев нет:
Отправить комментарий