MEF и два экземпляра одного класса - PullRequest
3 голосов
/ 09 марта 2011

Как поместить два экземпляра одного класса или интерфейса в MEF?Как бы я их получить?

1 Ответ

8 голосов
/ 09 марта 2011

По умолчанию любая деталь, зарегистрированная в MEF, использует одноэлементную стратегию управления временем жизни (по одной на контейнер). Это указывается по умолчанию CreationPolicy из Shared. Я думаю, вам нужно четко понимать, что вам нужно ...

Вы хотите новый экземпляр каждый раз, когда сочиняете?

Если это так, вы можете добавить PartCreationPolicyAttribute к вашему экспорту:

[PartCreationPolicy(CreationPolicy.NonShared), Export(typeof(IFoo))]
public class Foo : IFoo { }

Каждый раз, когда вы создаете класс с использованием своего контейнера, вы получаете новый экземпляр Foo.

Вы хотите два независимых экземпляра одновременно?

Возможно, вы захотите придумать альтернативный шаблон для получения экземпляров ваших частей. Вы можете использовать ExportFactory, который позволит вам создавать новые экземпляры, когда вам это нужно, например:

[Import]
public ExportFactory<IFoo> Factory { get; set; }

С:

public IFoo CreateFoo()
{
    return Factory.CreateExport().Value;
}

(Чтобы использовать ExportFactory<T> с приложениями, не относящимися к Silverlight, вы должны загрузить его здесь - ExportFactory<T> никогда не входил в .NET 4, только Silverlight).

...