Страницы

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

воскресенье, 12 января 2020 г.

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

#c_sharp #devexpress #unity_container


Есть базовый интерфейс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 в этой ситуации?
    


Ответы

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

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

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