Tag: mef

自定义’ExportFactory’

使用MEF的桌面应用程序导入许多“ServiceProviders”。 每个部分(ServiceProvider)都是一个单独的DLL内的类。 所有DLL都在“插件”文件夹中,供桌面应用程序使用。 由于我需要新部件的实例,因此ExportFactory是最佳选择。 问题是我的部件有构造函数。 我需要将一些参数传递给ExportFactory (MEF2,Preview2)不支持的部件的构造函数。 我需要这样的东西: // Each part has its own dependency Dependency dependency = LoadDependency(myPart.Metedata[“Name”]); // Injecting dependency into part’s constructor myPart.CreateExport(dependency); 我不想从我的零件方面导入任何东西。 可以在此处找到示例项目(带无参数构造函数)。

是否有.NET中热插拔的参考实现?

我正在寻找在.NET中完成热交换的良好实现。 我需要的是: 能够在特定文件夹中部署DLL并使用正在运行的系统来获取它们。 让正在运行的系统更新容器中的相应引用。 我一直在研究MEF及其目录加载机制,但它似乎非常不可靠。 也许有人在那里有另一种实现方式?

导入属性始终为null(MEF导入问题)

我尝试使用MEF完成一些事情,但现在,我遇到了一个需要帮助的问题。 说明:我有2个DLL和一个EXE文件。 ClassLibrary1(LoggerImpl.cs,SomeClass.cs)ClassLibrary2(ILogger.cs)WindowsApplicationForms1(WindowsApplicaitonForms1.cs,Program.cs) 我需要任何帮助或方向,为什么这不起作用? // ClassLibrary1.dll //SomeClass.cs public class SomeClass { [Import(“Logging”, typeof(ILogger))] public ILogger Log { get; set; } <– ALWAYS NULL ??? public void Print() { Log.Print(); } } // ClassLibrary1.dll // LoggerImpl.cs namespace ClassLibrary1 { [Export("Logging", typeof (ILogger))] public class LoggerImpl : ILogger { public void Print() { Console.WriteLine("print called"); } } […]

如何使用MEFinheritance导出和MetaData?

我有一个界面: [InheritedExport(typeof(IMetric))] public interface IMetric { … } 我有一个Meta属性界面: public interface IMetricAttribute { … } 以及实现它的属性: [MetadataAttribute] [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class MetricAttribute : ExportAttribute, IMetricAttribute { public string MetricName { get; set; } public string MetricDescription { get; set; } public MetricAttribute(string name, string description) : base(typeof(MetricAttribute)) { this.MetricName = name; this.MetricDescription = […]

MEF:我应该把CompositionContainer放在哪里?

我一直在使用Windsor IoC Container作为基于Web的应用程序,以解决应用程序应该使用的数据访问层实现。 Web应用程序的UI将由页面组成,每个页面由称为portlet的小单元组成。 (它们的概念有点类似于小部件。)这些所谓的portlet基本上是Web控件,可以在运行时为每个页面进行静态配置。 该应用程序将附带一些内置的,但我希望能够轻松扩展它。 我发现这个机制正是MEF的构建方式。 所以我决定以这样的方式实现系统,即它使用MEF发现portlet。 然后,我意识到它也可以做我目前使用的温莎,所以我决定放弃温莎而不是MEF。 显然,我将不得不使用DirectoryCatalog,它扫描应用程序的bin文件夹中的.dll并返回我需要的所有内容。 我在StackOverflow中阅读了一些有关MEF的教程,示例和所有问题。 我认为使用MEF的最简单方法是通过Glenn Block在其教程中提到的PartInitializer,但我意识到它不在MEF中。 实际上,它是我从CodePlex下载的代码,但是在一个单独的程序集中,并且只在源代码中,而不是以二进制forms。 (这是否意味着它不是MEF的一部分?或者将它放到一个单独的项目中有什么意义?)然后,我意识到它适用于Silverlight,所以它并没有真正帮助我。 (或者我应该只针对.NET 3.5编译它,还是将它包含在我的项目中,我很高兴去?) 所以现在我遇到了以下问题:我应该将CompositionContainer放在我的应用程序中? 还有一件事我想考虑一下:我应该在应用程序的生命周期中只使用一个CompositionContainer,或者我最好在每次需要时创建一个容器?

在.NET中只使用MEF获取必要的插件

我有IMessageSender界面。 using System.ComponentModel.Composition; public interface IMessageSender { void Send(string message); } 我有两个实现此接口的插件。 这是plugin.cs。 using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Reflection; using System; [Export(typeof(IMessageSender))] public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } } 这是plugin2.cs [Export(typeof(IMessageSender))] public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message + “!!!!”); } } 我有这个代码用MEF运行这些插件。 […]

如何在应用程序运行时发现新的MEF部件?

我正在使用MEF在我的应用程序中加载插件。 一切正常,但我希望在将它们放入我的app文件夹时发现它们。 这可能吗? DirectoryCatalog有一个Changed事件,但我不确定它是如何工作的。 这是我现在的代码: public sealed class RevealerFactory { private static readonly Lazy lazy = new Lazy(() => new RevealerFactory()); public static RevealerFactory Instance { get { return lazy.Value; } } private FileSystemWatcher watcher; private RevealerFactory() { Initialize(); } [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy> Revealers { get; set; } public IRevealer GetRevealer(Uri uri) { […]

应该为分布式应用程序中的插件动态加载定制MEF的哪些部分

我的模拟应用程序将使用插件来提供模拟算法和数据结构,以存储模拟数据。 该应用程序由两部分组成。 首先是提供UI的主机应用程序(作为WPF UI或作为CAD应用程序的插件)。 此应用程序处理与用户的所有交互,但不执行任何模拟计算,也不存储任何模拟数据。 第二部分是执行模拟计算的数据应用程序。 数据应用程序没有任何方式让用户直接与它进行交互,所有输入都是通过与主机的连接提供的(如果两者都在同一台机器上,则通过命名管道提供,如果它们在不同的机器上,则通过TCP提供)。 该方法允许通过具有多个数据应用的单个主机进行分布式计算。 数据应用程序通过一个或多个插件提供数据存储方法,模拟算法等,以便于添加新function。 为了实现这一目标,计划是: 让主机应用程序执行插件搜索。 主机应该存储描述插件及其元数据的数据,但它永远不会实例化任何插件类。 为了防止将程序集加载到主机应用程序中,需要以某种序列化格式存储插件的描述。 数据集应用程序将从主机请求插件信息,确定要加载的所需插件,请求传输正确的程序集(分布式计算所必需)并加载插件。 选择正确的插件应该基于Type(如在System.Type中)和其他信息,如优先级等。 为了让所有这些工作,我想我将不得不: 为数据应用程序编写某种延迟加载目录(类似于Silverlight中的DeploymentCatalog)。 技巧可能只是在应用程序确定需要实例化哪些类之后才请求转移和加载程序集。 为主机应用程序编写自己的程序集扫描机制,以一些序列化(字符串?)格式存储插件信息,以防止插件程序集被加载到主机应用程序中。 编写某种加载机制,可以选择正确的插件类,并确定如何加载它以及提供哪些构造参数。 找到一些方法允许插件指定设置值(包括默认值和所述值的本地化描述)和元数据。 我想做尽可能少的工作,所以我看了一些可用的.NET插件系统。 从它的外观来看,MEF似乎是最有希望的候选者。 我已经阅读了MEF的架构和能力,但我仍然有点不知道我应该把注意力集中在哪里。 所以我的问题是MEF的哪些部分必须定制才能使MEF与我计划的方法一起工作?

带有Managed Ext Framework(MEF)的工厂模式

我正在尝试用MEF实现Factory Pattern。 这是我的解决方案 核心项目 IClass ObjectFactory static Class(This is where the problem is) 项目A. [Export(typeof(IClass))] [ExportMetadata(“Type”, “TypeA”)] public classA : IClass {} 项目B [Export(typeof(IClass))] [ExportMetadata(“Type”, “TypeB”)] public classB : IClass {} 我在尝试动态创建对象时遇到问题 这是工厂类: public static class ObjectFactory { private static readonly CompositionContainer _container; [ImportMany] public static IEnumerable<Lazy> objectTypes; static ObjectFactory() { AggregateCatalog catalog = new […]

VS 2010鼠标处理器扩展 – 无法正常工作

我正在尝试使用Visual Studio 2010扩展,我需要处理IMouseProcessor公开的事件。 据我所知,我应该创建一个IMouseProcessorProvider并导出使用MEF,以便Visual Studio可以自动获取它。 我创建了这个类: [Export(typeof(IMouseProcessorProvider))] [ContentType(“code”)] internal sealed class MouseProcessorFactory : IMouseProcessorProvider { public IMouseProcessor GetAssociatedProcessor(IWpfTextView wpfTextView) { return new MouseProcessor(); } } 当我运行Visual Studio的实验实例时,我的扩展在扩展管理器中可见。 但我的自定义鼠标处理器提供商永远不会被调用。 我错过了什么/我做错了什么?