使用MEF在运行时实例化类

时间:2010-07-05 08:41:47

标签: .net mef

我确信这应该很容易,也许我错过了一些明显的东西。我有一堆实现IClass接口的类。在运行时,我想使用MEF DirectoryCatalog来检索实现该IClass接口的所有那些类的引用。所以,在这一点上,我有一些可以实例化的类池。

现在,从这一点开始,我希望能够根据当时正在执行的业务逻辑来实例化这些类中的一个或多个。所以我设法使DirectoryCatalog正常工作。我还设法实现了ImportMany,以便存在实现IClass接口的那些类的集合。

这没关系,但我不想简单地拥有所有类的集合,我可能希望能够随时实例化该类的多个版本。我开始考虑使用Lazy,但我认为这只会在实例化类时提供帮助,而不是多少。

再一次,我不禁想到我错过了一些明显的东西。任何帮助都会非常感激。

由于

2 个答案:

答案 0 :(得分:1)

  

我希望能够根据当时正在执行的业务逻辑来实例化这些类中的一个或多个。

MEF不了解您的业务逻辑,因此它不提供仅基于它来实例化类的机制并不是不合理的。我们的想法是,任何向MEF公开接口的对象都可以由应用程序用于该角色,包括由第三方创建的任何对象。

相反,公开具有接口的工厂,该接口允许它们根据决策所依据的任何参数来决定是否实例化对象。如果所有可能的提供者只需要一个对象,请让他们公开一些元数据,使客户能够决定使用的最佳工厂。

答案 1 :(得分:0)

我知道这已经过了几年,但进一步的调查帮助我找到了这个解决方案(我和OP有完全相同的问题): How do you use ExportFactory<T>

总结一下:

[ImportMany(typeof(ITask))]
//private IEnumerable<Lazy<ITask, ITaskMetaData>> myTasks;
private IEnumerable<ExportFactory<ITask, ITaskMetaData>> myTasks;

然后:

ITask taskInstance = runner.myTasks.FirstOrDefault(x => x.Metadata.TaskName.Equals(taskDb.TaskObjName)).CreateExport().Value;

其中runner是我的类,具有执行MEF魔法的私有构造函数

希望这将有助于未来的人