MEF Container.GetExportedValue <T>() не создает отдельные экземпляры - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь создать экземпляр модели представления из моего каталога

, когда я использую Container.GetExportedValue, а затем инициализирую свойства, для всех экземпляров которых в свойствах установлено значение конечного значения 'p'.но когда я использую стандартный инициализатор, они в порядке.

, поэтому в моем примере свойство Name FormViewModel в примере экземпляра MEF имеет эти значения

CCC

, но в обычном экземпляреПример имеет следующие значения:

ABC

Он ведет себя так, как будто существует некоторая общая ссылка для всех экземпляров, поступающих из контейнера MEF.

      var worker = new BackgroundWorker();
        worker.DoWork += (o, ea) =>
                         {
                             _forms = new ObservableCollection<FormViewModel>(
                                 FormsExplorerRepository.GetForms()
                                     .Select(p =>
                                             {
 // This way of instancing does strange stuff 
                                                 var fvm = Container.GetExportedValue<FormViewModel>();

// This is fine but of course I'm not getting the importing constructor called
                                                 var fvm = new FormViewModel();

                                                 fvm.Workspace = this;
                                                 fvm.FormId = p.FormId;
                                                 fvm.Label = p.Label;
                                                 fvm.Name = p.Name;
                                                 fvm.Disclaimer = p.Disclaimer;
                                                 fvm.CertificationText = p.CertificationText;
                                                 fvm.Schemes = FormViewModelExtensions.InitialiseSchemes(p);
                                                 return fvm;
                                             })
                                     .ToList());
                         };

вот конструкторы модели представления

    public FormViewModel()
        : base(null, true)
    {

    }

    [ImportingConstructor]
    public FormViewModel(
        IDialogManager dialogs,
        IEventAggregator events)
        : base(null, true)
    {
        _events = events;
        _events.Subscribe(this);

        _dialogs = dialogs;
    }

и у меня есть атрибут экспорта в определении класса

 [Export(typeof(FormViewModel)), PartCreationPolicy(CreationPolicy.NonShared)]
public class FormViewModel 

Надеюсь, здесь достаточно информации, чтобы кто-нибудь помог

1 Ответ

1 голос
/ 16 января 2012

Я нашел свою ошибку

Я не использовал правильный синтаксис в своем AddExportedValue (тот, который я здесь прокомментировал, был неправильным)

(container, batch) =>
{
    // batch.AddExportedValue(new FormViewModel());
    batch.AddExportedValue<Func<FormViewModel>>container.GetExportedValue<FormViewModel>);
}
...