Внедрить много классов в вид модели класса - PullRequest
0 голосов
/ 14 января 2011

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

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

[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

}

}

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

Ответы [ 2 ]

1 голос
/ 15 января 2011

Кому: Абэ Хайдбрехт.

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

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 имеет только один метод: OnImportsSatisfied, который вызывается, когда удовлетворен весь импорт, который может быть удовлетворен.

Я думаю, что лучше для модульного тестирования интерфейсов инициализации класса сервисов в consttructor класса модели представления.

0 голосов
/ 15 января 2011

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 создана правильно, но в зависимости от вашего сценария это может не иметь большого значения.

...