【问题标题】:Passing parameters/properties with MEF使用 MEF 传递参数/属性
【发布时间】:2012-03-31 20:25:24
【问题描述】:

考虑以下示例:
我有一个Car 类和一个ILogger 接口。我希望ILogger 实现记录(控制台、文件、数据库等)汽车规格列表。当然,我想将 MEF 用于 ILogger。但是对于日志记录,我的记录器类应该可以访问汽车的规格。而且我不确定将对象传递给我的记录器类的最佳方法是什么。为了更清楚,这里有一些代码:

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 对象。而且我不确定是否应该将它传递给记录器的构造函数或作为属性,或者只是一个方法参数。

  • 使用属性:如果我使用属性来传递汽车,ILogger 界面如下所示: 公共接口 ILogger { 车车{得到;放; } 无效日志(); }
    我可以遍历我的列表项,如下所示:
    静态无效主要(字符串 [] 参数)
    {
        程序 p = new Program(); // 在构造函数中进行合成
        var 汽车 = 新列表()
            {
                新车(){品牌=“日产”,型号=“天际线”},
                新车(){品牌=“保时捷”,模型=“卡雷拉”},
                新车(){品牌=“法拉利”,模型=“恩佐”}
            };
        foreach (var car in cars)
        {
            p.logger.Car = 汽车;
            p.logger.Log();
        }
        Console.ReadKey();
    }
    
  • 使用参数:界面:

    公共接口 ILogger { 无效日志(汽车汽车); }

    和程序:

    foreach (var car in cars) { p.logger.Log(汽车); }
  • 使用构造函数:这就是我似乎迷失的地方。我可以将ILogger 接口更改为:

    公共接口 ILogger { 车车{get;放;} 无效日志(); }

    在实现类中:

    [导出(类型(ICarLogger))] 公共类 ConsoleLogger : ICarLogger { 公共汽车汽车{得到;放; } [导入构造函数] 公共控制台记录器(车载) { 这个.汽车=汽车; } 公共无效日志() { Console.WriteLine("品牌: {0}\tModel: {1}", Car.Brand, Car.Model); } }

但是这会导致每次我想向构造函数传递一个新值时创建CompositionContainer(通过使用ComposeExportedValue 方法)。简单地说,如何将各种变量传递给构造函数,而不必再次重建整个CompositionContainer

那么,您认为这 3 种方法中哪一种更好。以及如何实现上述的 constructor 方法?希望我清楚地描述了我的问题。
感谢并为冗长的问题道歉。
附言我正在使用 .Net 4 附带的 MEF 版本。

【问题讨论】:

  • 您想为每辆车实例化一个新的 ILogger 吗?或者,正如@blindmeis 建议的那样,ILogger 中的 IEnumerable ?我有一个类似的问题,请参阅我的回答:stackoverflow.com/q/9626227/210709
  • @IAbstract:请看我对blindmeis回复的评论。

标签: c# module mef modularity


【解决方案1】:

你写了你想记录一个汽车列表,所以不应该这样:

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

【讨论】:

  • 感谢您的回复,但示例只是为了解释我在传递参数方面遇到的问题。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 2013-06-14
  • 2017-11-19
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多