Tag: mef

是否每次都要求MEF导出缓存或发现?

如果我有一个类型MyClass,请注册 [Export(typeof(Myclass))]属性,和 [PartCreationPolicy(CreationPolicy.Shared)] 要么 [PartCreationPolicy(CreationPolicy.NonShared)] 然后试着打电话 compositionContainer.GetExportedValue()多次。 问题:在第一次通话时,我将通过MEF获取我的注册课程 – llokup所有已注册的程序集,然后尝试查找一个已注册的合同。 问题是关于第二次等等 – MEF会再次进行全局查询还是在内部缓存?

DbSet.Cast ()错误:无法从非genericsDbSet为“实体”类型的对象创建DbSet

版本信息: 我正在使用C#4.5,Entity Framework 6.0和MEF。 代码和unit testing 我创建了一个测试项目来解释这个问题: https : //skydrive.live.com/redir?resid = E3C97EC293A34048!2234 请打开UnitTest项目并尝试运行TestIfItWorks()unit testing。 问题 我想将非genericsDbSet转换为其通用版本,但是我得到以下exception: InvalidCastException: Cannot create a DbSet from a non-generic DbSet for objects of type ‘User’ : var nonGeneric = context.Set(typeof(User)); var generic = nonGeneric.Cast(); //Exception in here User类正在实现IUser,所以你会认为强制转换不应该是一个问题,除非DbSet代码被限制在具体的类中(我希望不是我需要创建一个围绕非genericsDbSet的包装器将它转换为genericsDbSet或找到当前DbSet实现的替代方案)。 如果你想知道为什么我使用接口,即使它们目前不受微软支持我给你一些解释(希望这会过滤掉“不要那样做”而不是提供解决方案的响应): 我正在使用MEF和EntityFramework创建一个松散耦合的数据层引擎,通过它我可以为每个项目提供实体(及其相应的配置)。 我一直在广泛使用Interfaces来定义引擎。 使用MEF在运行时发现元数据和上下文中实体的具体实现。 摘自代码 [TestMethod] public void TestIfItWorks() { //TODO: Please […]

MEF2中强类型元数据(System.Composition)

我在新的ASP.NET MVC4项目中使用来自MEF的System.Composition命名空间用于Web和Windowsapp store应用NuGet包 。 我已经读过 ,在MEF2中你不再使用Lazy ,但是现在你必须为元数据视图提供一个具体的类型(并且可能使用ExportFactory 而不是Lazy ?)。 但是,我找不到任何关于如何工作的例子 – 只提到使用具体类型而不是接口。 我已经尝试了一些方法,但不断收到以下错误 – “ 缺少’AccountID’的导出元数据,并且没有提供默认值 ”。 我的代码…… 创建容器(在Global.asax或App_Start文件夹中): // Get assemblies that will be providing imports and exports var assemblies = GetAssemblies(); // Get conventions that will be used to find imports and exports var conventions = GetConventions(); var container = new ContainerConfiguration().WithAssemblies(assemblies, conventions).CreateContainer(); […]

MEF =可能会遇到挫折感?

UPDATE 因为我试图在我的应用程序中使MEF工作,所以我遇到了更多的地方,我只是不明白为什么它不会在我期望的时候自动创建我的库。 我想这一切都回到了里德所说的关于需要MEF来创造一切的东西。 所以现在,我有一个XML阅读器类需要使用我的CandySettings,但即使它的ICandySettings属性具有[Import]属性,它也不会被导入。 首先我发现[导入]不适用于静力学,所以我改变了这一点。 但在那之后它仍然无效。 我认为这是因为我手动创建XML阅读器对象,而MEF要我做的是[导入] XML阅读器…这意味着我现在必须有一个接口。 这几乎就像使用IoC(或至少用于MEF),这是一个全有或全无的事情。 你不能随便随意使用它,因为最终你想要注入属性的类也需要由MEF创建。 如果我错了请纠正我! 原帖 嗯,这还不错。 :)但是在Reed指出MEF作为IoC的潜在替代品之后我确实有问题(到目前为止看起来确实很不错)。 请考虑以下模型: alt text http://bit.ly/9W0sHt 正如你所看到的,我有一个应用程序,这个应用程序使用插件(哎呀,错过了那个关联!)。 App和Plugins都需要使用CandySettings类型的对象,这可以在另一个程序集中找到。 我首先尝试在MEF中使用ComposeParts方法,但我能让它工作的唯一方法是在插件代码中执行类似的操作。 var container = new CompositionContainer(); container.ComposeParts(this, new CandySettings()); 但这没有任何意义,因为我为什么要在插件中创建CandySettings实例? 它应该在App中。 但是如果我把它放在App代码中,那么即使我在插件中使用[Import]和在CandySettings中使用[Export],插件也不会神奇地弄清楚如何获得ICandySettings。 编辑 (可能是因为我应该从应用程序调用ComposeParts()然后传递它的插件?) 我这样做的方法是使用MEF的DirectoryCatalog ,因为这允许插件在构造时扫描当前文件夹中的所有程序集并自动导入用[Import]属性标记的所有内容。 所以它看起来像这样,并且可能在每个插件中: var catalog = new DirectoryCatalog(“.”); var container = new CompositionContainer(catalog); container.ComposeParts(this); 这完全有效,但我不禁认为这不是MEF的用途吗?

如何在设计时在棱镜模块中使用资源字典?

我在一个silverlight应用程序中使用prism框架,在单独的XAP中有多个模块。 我在我的shell项目中定义了一个资源字典。 在我的模块中,我可以很好地使用资源,但由于模块与shell分离,直到它们在运行时加载,设计器不会显示它们或识别它们。 有没有办法让模块在设计时知道我的资源而不在每个视图xaml中合并我的资源文件? 我的资源文件位于“常见”项目中。

仅在给定Type实例的情况下从MEF容器导出

我有一个场景,我必须从我的CompositionContainer实例导出,但我只有一个类型可以使用; 我不知道编译时的类型,因此我无法以通常的通用方式检索导出的对象。 通常你会这样做: _container.GetExportedObject(); 但就我而言,我有这个: Type someType = … ; _container.HowDoIGetTheExport(someType); 有任何想法吗?

MEF如何确定其import顺序?

MEF允许您通过使用ImportMany属性导入多个部件。 它如何确定检索相关导出的顺序并将它们添加到您正在填充的可枚举中? 例如,如何导入必须按特定顺序触发的多个IRules? 我能想到的唯一方法是在IRule中使用OrderValue属性并手动排序: public class Engine { [ImportMany] public IEnumerable Rules { get; set; } public void Run() { // … // Initialise MEF // … // // Do I need to manually order Rules here? // foreach (IRule rule in Rules) { // Must execute in a specific order rule.Execute(); } } }

当我更换零件时如何让MEF重新组合?

我正在尝试让MEF重新组合它在更新导出的实例时所知道的所有部分。 基本上我想让MEF更新所有在更改时导入连接字符串配置值的部分。 一切看起来都很好,直到我想要更改实例。 如果我尝试使用更新的值ComposeParts,它似乎将第二个部分实例添加到容器中,然后我的导入更新,但为null。 谁能指出我哪里出错? 或者我应该尝试以这种方式使用MEF? 我正在使用MEF预览9和目标.net框架3.5和WPF。 using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Text; using Shouldly; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { MainClass main = new MainClass(); main.RunTest(); } } public class MainClass { [ImportMany] public IEnumerable Settings { get; set; } public void RunTest() […]

如何在运行时删除MEF插件?

我有一个基于MEF的应用程序,可以使用插件进行自定义。 这个应用程序有几个导入的部分,我想在用户决定删除该插件时在运行时删除其中一些(以便能够删除包含它们的.dll)。 CompositionBatch可以满足我的需要,但它需要ComposablePart实例作为RemovePart()方法的输入参数,我只有普通对象实现了ISomething接口,或AggregateCatalog ComposablePartDefinition实例。 所以我的问题是: 如何找到表示我想要删除的导入对象的ComposablePart实例? 或者:如何获取属于某个.dll的ComposablePart对象列表? 我会用以下内容: var parts = Container.Catalog.Parts .Where(p => iDontNeed(p)) .Select(p => howDoIConvertComposablePartDefinition2ComposablePart(p)); var batch = new CompositionBatch(); parts.ToList().ForEach(part => batch.RemovePart(part)); 谢谢

如何将MEF导入和导出信息保存到磁盘

对于我在这个问题中描述的应用程序,我想使用MEF扫描可用的插件程序集,然后以序列化格式(例如一组字符串或内存流)存储所有可用的导入和导出信息。 这是必要的,因为我需要通过AppDomain边界传输导入和导出信息而不加载插件程序集(基本上我想延迟加载插件)。 我找到了一些参考文献,比如这个或者这个,但没有一个链接让我知道如何: 从程序集中提取所有导入和导出 序列化所有必需的导入/导出信息 然后再将序列化信息重新水合成import和出口。 我想我可以使用ReflectionModelServices类来创建导入/导出定义但仍然保留序列化和反序列化部分。 任何人都可以向我指出一些例子,文档或者提供关于如何进行这些步骤的建议吗?