Страницы

Поиск по вопросам

четверг, 7 марта 2019 г.

Как вызвать статический метод класса возврающающий экземляр для использования Unity?

Есть базовый интерфейсIViewModel для всех моих ViewModel. Все ViewModel используют DevExpress POCO механизм:
public static EfCaseCollectionViewModel Create(IUnitOfWorkFactory unitOfWorkFactory = 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 в этой ситуации?


Ответ

Спасибо за ссылку, помогла как пища для размышлений.
Честно, часть вопроса связанная с 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(); }
Я не уверен что решение правильное, но мою текущую задачу оно выполнило.

Комментариев нет:

Отправить комментарий