请考虑以下示例:
我有一个 Car
类和一个 ILogger
接口 . 我希望 ILogger
实现记录(控制台,文件,数据库等)汽车列表' specs. And of course, I want to use MEF for ILogger. But for logging, my logger class should have access to a car'的规范 . 而我'm not sure what would be the best way to pass objects to my logger classes. To be more clear, here'的一些代码:
class Program
{
public class Car
{
public string Brand { get; set; }
public string Model { get; set; }
}
private CompositionContainer _container;
[Import(typeof(ILogger))]
public ILogger logger;
private Program()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
this._container = new CompositionContainer(catalog);
this._container.ComposeParts(this);
}
ILogger
接口应该获取 Car
对象以进行日志记录 . 我'm not sure whether I should pass it in logger'的构造函数或作为属性,或只是一个方法参数 .
- Using property :如果我使用属性传递汽车,
ILogger
界面如下所示:
public interface ILogger
{
Car Car { get; set; }
void Log();
}
我可以遍历我的列表项,如下所示:
static void Main(string[] args)
{
Program p = new Program(); // Composition is performed in the constructor
var cars = new List()
{
new Car() { Brand = "Nissan", Model = "SkyLine" },
new Car() { Brand = "Porche", Model = "Carrera"},
new Car() { Brand = "Ferrari", Model = "Enzo"}
};
foreach (var car in cars)
{
p.logger.Car = car;
p.logger.Log();
}
Console.ReadKey();
}
- Using parameter :界面:
public interface ILogger
{
void Log(Car car);
}
和程序:
foreach (var car in cars)
{
p.logger.Log(car);
}
- Using constructor :这就是我似乎迷失的地方 . 我可以将
ILogger
接口更改为:
public interface ILogger
{
Car Car {get; set;}
void Log();
}
并在实施的类中:
[Export(typeof(ICarLogger))]
public class ConsoleLogger : ICarLogger
{
public Car Car { get; set; }
[ImportingConstructor]
public ConsoleLogger(Car car)
{
this.Car = car;
}
public void Log()
{
Console.WriteLine("Brand: {0}\tModel: {1}", Car.Brand, Car.Model);
}
}
But 这导致每次我想将新值传递给构造函数时创建 CompositionContainer
(通过使用 ComposeExportedValue
方法) . 简单地说,我怎样才能将各种变量传递给构造函数而不必再次重建整个 CompositionContainer
?
那么,在您看来,这三种方法中的哪一种更好 . 我如何实现所提到的构造函数方法?希望我能清楚地描述我的问题 .
感谢并为这个冗长的问题道歉 .
附:我正在使用.Net 4附带的MEF版本 .
1 回答
你写过你想要记录汽车列表,所以不应该是: