我定义了以下界面
IOne
ITwo
IThree
ICalcalculator
并有几个实现
ClassOne: IOne
ClassTwo: IOne
ClassThree : ITwo
ClassFour : ITwo
ClassFive: IThree
MyCalc : ICalculator
MyCalc需要1-4类,但ClassOne
和ClassThree
的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
构造函数中的代码应该放在哪里?