Страницы

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

Показаны сообщения с ярлыком unity-container. Показать все сообщения
Показаны сообщения с ярлыком unity-container. Показать все сообщения

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

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