Укажите разные значения для одного и того же импорта, используя MEF. - PullRequest
2 голосов
/ 26 мая 2011

Этот вопрос относится к использованию MEF.

Я хочу предоставить разные значения для одного и того же импорта в этих двух сценариях

[Export("A1", typeof(IA))]
[Export("A2", typeof(IA))]
class A : IA
{
  [Import("B")]
  public IB B;
}

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(IA))]
class A : IA
{
  [Import]
  public IB B;
}

В обоих приведенных выше сценариях я хочу удовлетворить импорт IB с разными значениями, то есть когда я делаю это в первом типе экспорта

var a1 = Container.GetExportedValue<IA>("A1");
var a2 = Container.GetExportedValue<IA>("A1");

или это во втором экспорте

var a1 = Container.GetExportedValue<IA>();
var a2 = Container.GetExportedValue<IA>();

Я хочу, чтобы два экземпляра A a1 и a2 имели разные значения IB. Я не хочу использовать ImportMany, потому что тогда я должен решить, какой из них выбрать, и я хочу не допустить эту логику в класс A.

Два сценария, связанные с этим экспортом, состоят в том, что я хочу иметь общее универсальное представление для работы с различными типами моделей представлений, реализующих некоторый интерфейс и различные экземпляры класса, который предоставляет некоторую службу, которая должна быть настроена с различными параметрами конфигурации. 1020 *

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

Возможно, вы ищете что-то вроде этого?

public class AExporter
{
    [Export("A1", typeof(IA)]
    public IA A1
    {
        get
        {
             return new A(this.B1);
        }
    }

    [Export("A2", typeof(IA)]
    public IA A2
    {
        get
        {
            return new A(this.B2);
        }
    }

    [Import("B1", typeof(IB))]
    public IB B1 { private get; set; }

    [Import("B2", typeof(IB))]
    public IB B2 { private get; set; }

}

Однако MEF на самом деле не предназначен для такого тонкого контроля над композицией.Вы можете попробовать альтернативу, такую ​​как Autofac , которая хорошо интегрируется с MEF.

0 голосов
/ 26 мая 2011

Я не совсем понимаю, что вы пытаетесь сделать, но я думаю, что вы можете сделать это, указав политику создания NonShared при импорте IB.

[Import(RequiredCreationPolicy=CreationPolicy.NonShared)]
public IB B;
...