Импорт конструктора MEF с помощью Caliburn Micro в WPF - PullRequest
0 голосов
/ 25 сентября 2019

Быстрый вопрос, у меня есть пара моделей представления, которые назначаются в ShellViewModel (экспорт использовался для этих 3 виртуальных машин)

    [ImportingConstructor]
    public ShellViewModel(MainWindowViewModel viewModel,
                          SelectionViewModel sViewModel,
                          GStatsViewModel gsViewModel)
    {
        mainWindowViewModel = viewModel;
        selectionViewModel = sViewModel;
        gStatsViewModel = gsViewModel;
    }

Вопрос в том, что я хотел ввести "Сервис" вMainWindowViewModel.

Это служба

[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IObjService))]
public class ObjService : IObjService
{
    private ObservableCollection<ObjA> objSource = new ObservableCollection<ObjA>();
    public ObservableCollection<ObjA> ObjSource
    {
        get { return objSource; }
        set
        {
            objSource= value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

И в моем MainWindowViewModel

    private ObjService objService;

    // Can I use the importing constructor here?
    public MainWindowViewModel(// something here?)
    {
        // Setup service
        // or something here?

Вопрос в том, как я могу это сделать?Как MainWindowViewModel может иметь конструктор импорта, но работать так, как он работает в данный момент, как у меня в ShellViewModel?

Кроме того, это нормально?Я хочу, чтобы модели представления всегда имели одну и ту же ссылку на наблюдаемую коллекцию ObjA, поскольку она будет использоваться во всем мире ... так что же это путь вперед?

Спасибо

Мое приложениеиспользует архитектуру MVVM

РЕДАКТИРОВАТЬ

, если я делаю это

    private ObjService objService;

    [ImportingConstructor]
    public MainWindowViewModel(ObjService serviceToUse)
    {
        // Setup service
        objService = serviceToUse;

, я получаю исключение от Caliburn Micro, говоря

throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));

Для IShell

В загрузчике я делаю

        var batch = new CompositionBatch();

        batch.AddExportedValue<IWindowManager>(new WindowManager());
        batch.AddExportedValue<IEventAggregator>(new EventAggregator());
        batch.AddExportedValue<IObjService>(new ObjService());
        batch.AddExportedValue(container);

        container.Compose(batch);

Если я изменяю конструктор на это в MainWindowViewModel, он работает ... Я не уверен, почему он работаетс интерфейсом, но не конкретным классом.Я думаю, это потому, что он все равно переводится в новый конкретный класс, так что вы должны дать ему интерфейс, правильно?

Часть, которая работает приватно IObjService objService;

    [ImportingConstructor]
    public MainWindowViewModel(IObjService serviceToUse)
    {
        // Setup service
        objService = serviceToUse;
...