使用 MEF 传递参数/属性

Posted

技术标签:

【中文标题】使用 MEF 传递参数/属性【英文标题】:Passing parameters/properties with 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 ?我有一个类似的问题,请参阅我的回答:***.com/q/9626227/210709 @IAbstract:请看我对blindmeis回复的评论。 【参考方案1】:

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

public interface ILogger

   void Log(IEnumerable<Car> cars);

【讨论】:

感谢您的回复,但示例只是为了解释我在传递参数方面遇到的问题。

以上是关于使用 MEF 传递参数/属性的主要内容,如果未能解决你的问题,请参考以下文章

struts2怎么向jsp传递参数

我可以在 Vue.Js 的计算属性中传递参数吗

WPF 利用附加属性创建FreezableCollection集合和反射实现控件参数以MVVM模式传递

mybatis不同参数传递取值方式

mybatis不同参数传递取值方式

React传递参数的多种方式