У меня определен следующий интерфейс
IOne
ITwo
IThree
ICalcalculator
И иметь несколько реализаций из них
ClassOne: IOne
ClassTwo: IOne
ClassThree : ITwo
ClassFour : ITwo
ClassFive: IThree
MyCalc : ICalculator
MyCalc требует классов 1-4, однако 2 экземпляра ClassOne
и ClassThree
различаются как инициализация, т.е.
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
?