2015-10-02 2 views
1

Я импортирую объект Lazy<MyForm> с использованием MEF (инъекция зависимостей, инъекция конструктора) и в основном имеет проблему: когда я показываю и закрываю форму, а затем пытаюсь снова открыть форму, она больше не будет работать, вызывать объект уже был ликвидирован. Я хочу иметь абсолютно новый экземпляр формы каждый раз, когда я его открываю.Lazy <T> - Всегда создавайте новый объект?

Есть ли класс, похожий на Lazy<T>, но всегда дает мне новый объект?

Edit:

Я не могу дать вам свой код в данный момент, но я пойду немного более подробно:

Где две формы:

Form1 является отправной form, в котором есть ImportingConstructor, который в настоящее время импортирует объект Lazy<Form2>. У моего Form2 есть также ImportingConstructor, который импортирует несколько других классов. Когда я нажимаю кнопку на Form1, происходит обращение к m_lazyForm2.Value и появляется сообщение Form2.

MEF (и моя форма1) инициализируются с использованием этого загрузочного устройства, которое я сам создаю.

internal class Bootstrapper<T> where T : Form 
{ 
    [Import] 
    private T m_frmStartup; 
    private CompositionContainer m_container; 

    public void Init() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     var batch = new CompositionBatch(); 
     batch.AddPart(catalog); 

     m_container = new CompositionContainer(catalog); 
     m_container.ComposeParts(this); 
    } 

    public void Start() 
    { 
     Application.Run(m_frmStartup); 
    } 
} 
+2

Почему вы не можете просто перейти в 'Func ', который каждый раз создает новый 'T'? –

+0

Мои классы T имеют ImportingConstructor, а также – Jannik

+1

Показать код, как вы настроили свой DI и как вы его используете. –

ответ

0

Хорошо, как я уже сказал в своем комментарии, я нашел решение самостоятельно.

Решение было:

  1. Изменить мои Lazy<T> импорта в ExportFactory<T> импорта
  2. экспорта все мои взгляды с атрибутом [PartCreationPolicy(CreationPolicy.NonShared)]

Таким образом, каждый раз, когда вы звоните m_myViewExportFactory.CreateExport().Value, это даст вы новый экземпляр вашего представления.

1

Вы могли бы искать factory method, либо передаются в форму в качестве делегата непосредственно, или заворачивают в потенциально анонимную реализацию некоторого интерфейса.

A Lazy<T> действительно имеет целью инициализировать только T в последний возможный момент времени, то есть когда это действительно необходимо. Для этого он либо просто вызывает конструктор по умолчанию для типа T, либо выполняет поставляемый заводской метод в форме делегата Func<T>.

Вы можете просто передать это Func<T> в вашу форму вместо обертки Lazy<T>.

Смежные вопросы