首页 文章

使用MEF传递参数/属性

提问于
浏览
0

请考虑以下示例:
我有一个 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 回答

  • 0

    你写过你想要记录汽车列表,所以不应该是:

    public interface ILogger
    {
       void Log(IEnumerable<Car> cars);
    }
    

相关问题