我可以使用MEF用不同的构造函数参数组合几个相同类型的项吗?

时间:2012-01-24 10:14:43

标签: c# mef

我定义了以下界面

  • IOne
  • ITwo
  • IThree
  • ICalcalculator

并有几个实现

  • ClassOne: IOne
  • ClassTwo: IOne
  • ClassThree : ITwo
  • ClassFour : ITwo
  • ClassFive: IThree
  • MyCalc : ICalculator

MyCalc需要1-4类,但ClassOneClassThree的2个实例区分为初始化,即

public MyCalc(){
    ClassOne first= new ClassOne("filePath1");
    ClassOne second = new ClassOne("filePath2");
    ClassThree third = new ClassThree ("filePath3");
    ClassThree fourth = new ClassThree ("filePath4");
}

我正在尝试使用MEF来创建构造MyCalc。在上面的示例中,filePathX将位于配置文件中。到目前为止,我已经完成了以下操作,但它似乎有效,但我的感觉是我当前的方法和方法不正确。看看这种方法,我已经将自己限制在名称(ValDatePrices和EDDatePrices)中,并且它不比我目前的方法更清晰(见上文)。

是否有更简洁的方法来加载具有不同ctor参数的多个相同类型的对象?

public class MyCalc: ICalculator
{
    private CompositionContainer container; 

    public MyCalc()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyCalc).Assembly));

        container = new CompositionContainer(catalog);

        try
        {

        this.container.ComposeExportedValue<ClassFive>(
               new ClassFive((ConfigurationManager.AppSettings["SomePath"])));
        this.container.ComposeExportedValue<ClassOne>(
              "ValDatePrices"
              , new ClassOne((ConfigurationManager.AppSettings["filePath1"])));
        this.container.ComposeExportedValue<ClassOne>(
              "EDDatePrices"
               , new ClassOne((ConfigurationManager.AppSettings["filePath2"])));

        this.container.ComposeParts(this);

        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }

    }

    [Import("ValDatePrices")]
    public ClassOne ValDatePrices;

    [Import("EDDatePrices")]
    public ClassOne EDDatePrices;

    [Import]
    public ClassFive SPointReader;

    public void Calculate()
    {

        Console.WriteLine(SPointReader.Result);
        Console.WriteLine(ValDatePrices.Result.Count);
        Console.WriteLine(EDDatePrices.Result.Count);

        Console.ReadKey(); 
    }
}

用法

class Program
{
    static void Main(string[] args)
    {
        var p = new MyCalc();
        p.Calculate();
    }
}
}

附带问题:MyCalc构造函数中的代码应该放在哪里?

0 个答案:

没有答案