Вопрос

Я разрабатываю приложение WPF с дизайном MVVM. В качестве структуры MVVM я использую Caliburn Micro. Сервис, который у меня есть во внешней сборке, и он вводится в классах моделей с MEF.

Проблема в обслуживании У меня много маленького класса, я стараюсь уважать твердую Принципи.

[Export(typeof(IClassA)]
public class ClassA : IClassA
{}

[Export(typeof(IClassB)]
public class ClassB : IClassB
{}

[Export(typeof(IClassC)]
public class ClassC : IClassC
{}

//...
[Export(typeof(IClassK)]
public class ClassK : IClassK
{}

Считается, что занятия составляет около 12-15.

Мне нужно использовать эти классы в классе модели. Итак, я использую это:

public class MyViewModelClass
{
 private interface IClassA _a;
 private interface IClassB _b;
 private interface IClassC _c;


//...
 private interface IClassK _k;


[ImportingConstructor]
public MyViewModelClass(IClassA a, IClassB b, IClass c, ..., IClassK k)
{
_a=a; _b=b; _c=c; ...  _k=k

}

}

Я так не так правильно. Или существует что -то элегантное, простое. Спасибо за ваше мнение и советы.

Это было полезно?

Решение

MEF может импортировать в поля (даже частные). Если вы хотите сделать свою жизнь немного проще, вы можете просто украсить поля с помощью ImportAttribute. Анкет Если вы хотите знать, когда все импорт завершится, просто реализуйте IPartImportsSatisfiedNotification интерфейс:

public class MyViewModelClass : IPartImportsSatisfiedNotification
{
    [Import]
    private IClassA _a; 
    [Import]
    private IClassB _b; 
    [Import]
    private IClassC _c;

    ...

    public void OnImportsSatisfied()
    {
        // add initialization code here
    }
}

Это в значительной степени требует, чтобы вы использовали MEF, чтобы убедиться, что ваш ViewModel создается правильно, но в зависимости от вашего сценария, это может быть не имеет большого значения.

Другие советы

К: Абэ Хейдбрехт.

Я мало смущаю. Если я использую это:

public class MyViewModelClass : IPartImportsSatisfiedNotification
{
    [Import]
    private IClassA _a;  // I need init _a?
    [Import]
    private IClassB _b; 
    [Import]
    private IClassC _c;

    ...

    public void OnImportsSatisfied()
    {
        // what code must be here ?
        //how can I check if all import was success
    }
}

Потому что.

Ipartimportssatisfiednotification имеет только один метод: onimportssatifored, который называется, когда все импорты, которые могут быть удовлетворены, были удовлетворены.

Я думаю, что это лучше для единичного тестирования интерфейсов класса услуг в Contstructor of View Model Class.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top