使用 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
接口更改为:
在实现类中:
[导出(类型(ICarLogger))] 公共类 ConsoleLogger : ICarLogger 公共汽车汽车得到;放; [导入构造函数] 公共控制台记录器(车载) 这个.汽车=汽车; 公共无效日志() Console.WriteLine("品牌: 0\tModel: 1", Car.Brand, Car.Model);但是这会导致每次我想向构造函数传递一个新值时创建CompositionContainer
(通过使用ComposeExportedValue
方法)。简单地说,如何将各种变量传递给构造函数,而不必再次重建整个CompositionContainer
?
那么,您认为这 3 种方法中哪一种更好。以及如何实现上述的 constructor 方法?希望我清楚地描述了我的问题。 感谢并为冗长的问题道歉。 附言我正在使用 .Net 4 附带的 MEF 版本。
【问题讨论】:
您想为每辆车实例化一个新的 ILogger 吗?或者,正如@blindmeis 建议的那样,ILogger 中的 IEnumerable你写了你想记录一个汽车列表,所以不应该这样:
public interface ILogger
void Log(IEnumerable<Car> cars);
【讨论】:
感谢您的回复,但示例只是为了解释我在传递参数方面遇到的问题。以上是关于使用 MEF 传递参数/属性的主要内容,如果未能解决你的问题,请参考以下文章