是否可以从导入的MEF类型获取程序集信息而无需实例化类型?我需要知道包含Type的Plugin控件的程序集名称和版本。试过以下内容,但它只返回System.ComponentModel.Composition。
foreach (Lazy<UserControl, IMetadata> content in contents)
{
// get assembly information of the Plugin control for the imported function
string definingAssembly = content.GetType().Assembly.GetName();
Console.WriteLine(definingAssembly);
}
为避免维护问题,我希望避免在元数据中指定此信息。
答案 0 :(得分:2)
这是pops up on the MEF forum时不时出现的常见问题解答。 (我确信有几个更好的线程包含答案,但我无法立即找到答案。)
MEF不支持检查延迟导入的部件类型(不实例化该部件)。这可能是因为其设计理念中包含两个要素:
MEF鼓励松耦合。您应该根据合同指定和使用导入。依赖导入的实际类类型将阻止您将来更改组合。
MEF允许延迟加载类型。假设有一个Lazy.PartType
属性,您可以使用它来检查零件的实际类型。这将强制加载零件类型和包含组件。然后你根据PartType
决定你不想实例化那个特定的部分,并且装配负载是没有的。
(据我所知,目前MEF还没有开箱即用的第二个设计功能。无论如何,当调用AssemblyCatalog.Parts
时,AssemblyCatalog会立即检查所有类型。但MEF中有一个样本显示如何缓存有关程序集的信息以延迟或避免程序集加载的源。)
因此,您应该添加一些可用于选择导入的元数据,而不是依赖于零件的确切类型。
答案 1 :(得分:0)
您尝试的内容应该失败,因为程序集永远不会是动态加载的模块程序集。
我想如果你没有实例化一个类型,那个模块程序集甚至都没有加载到内存中。
你有没有尝试发布到MEF讨论区?在那里你可能会见到开发者。
答案 2 :(得分:0)
我一直在考虑这个问题,因为我自己遇到了这个问题。我希望按需创建实例,而不是通过合成为我创建实例。
我的场景是我不需要知道特定类型,但我可能需要创建该类型的多个实例,使用它们,并在适当时处理它们。我提出的解决方案是使用MEF加载具体类型而不是使用MEF为我创建实例,使用MEF加载知道如何创建我想要控制生命周期类型的实例的工厂。
MEF将加载并创建工厂,然后我可以使用工厂创建我可以随意使用和处理的实例。