Внедрить многие классы в классе модели
-
11-10-2019 - |
Вопрос
Я разрабатываю приложение 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.