Tag: mef

如何从MEF容器中释放共享实例

我试图释放共享实例或单例值。 有谁知道如何做到这一点? 我是否需要刷新目录? 我正在学习MEF所以请帮助。 上课的例子 [Export] public class Foo { public RandomProperty {get;set;} [ImportConstructor] public Foo() {} } 您可以使用以下内容创建它: var fooSingleton = ServiceLocator.GetInstance(typeof(Foo)); 一切都很好,但理想情况下我想做这样的事情 Container.Replace(oldFoo, newFoo); 所以当我再打电话的时候 var fooSingleton = ServiceLocator.GetInstance(typeof(Foo)); fooSingleton将拥有新值。 我认为答案可能依赖于实际清理目录然后刷新它 – 但这对于这么简单的事情来说似乎有些过分。

如何使用MEF防止模块重复?

如果存在2个相同组件的副本(可能是错误的),我如何防止MEF加载重复模块 Assembly1.dll Assembly2.dll(Assembly1的副本) [ImportMany] public IList Modules { get; private set; } public void BuildUp() { Modules = new List(); var catalog = new DirectoryCatalog(@”.\Modules”); var container = new CompositionContainer(catalog); container.ComposeParts(this); }

解耦视图,演示文稿和ASP.NET Web窗体

我有一个ASP.NET Web窗体页面,演示者需要在其中填充控件。 这种交互对页面生命周期有点敏感,我想知道是否有一个技巧,我不知道。 我想要对整个事情保持实用,但不要牺牲可测试性。 目前我有这个: public interface ISomeContract { void InstantiateIn(System.Web.UI.Control container); } 这个契约依赖于System.Web.UI.Control,我需要能够使用ASP.NET Web Forms编程模型。 但是视图和演示者都不了解ASP.NET服务器控件。 我该如何解决这个问题? 如何在我的具体视图中使用ASP.NET Web窗体编程模型而不在合同程序集中使用System.Web.UI.Control依赖项? 为了澄清一点,这种类型的界面都是关于UI组合(使用MEF)。 它在整个框架中是众所周知的,但它实际上只是在具体视图中调用。 具体视图仍然是唯一知道ASP.NET Web窗体的东西。 但是,那些说InstantiateIn(System.Web.UI.Control)公共方法存在于我的合同程序集中,这意味着对ASP.NET Web窗体的依赖。 我一直在考虑一些双重调度机制甚至访问者模式来尝试解决这个问题,但我还不知道我想去哪个方向,我真的希望对此事有一些意见。

在设置先决条件导入之前,无法调用GetExportedValue

我们在WPF应用程序中使用MEF 。 我们收到此错误 : 在先决条件导入’MyNamespace.MyMainClass..ctor(Parameter =“myParameter”,ContractName =“IContractInterface”)’已设置之前,无法调用GetExportedValue。 我没有使用线程 ,我有时会读到这个错误发生在多个线程上,但是为了防止我创建了组合容器,将“thread safe”参数传递给了true var container = new CompositionContainer(catalog, true); 我的守则是: 我的简化主类代码是:(想法是如果IMySubClass没有导入,我将使用默认的实现,这就是我在“OmImportsSatisfied”方法上创建它并满足其导入的原因。) MyMainClass C# [Export(typeof(IMyInterface)] public class MyMainClass: IPartImportsSatisfiedNotification, IMyInterface { [Import] public IContainer Container { get; private set; } [Import(AllowDefault = true)] public IMySubClass MySubClass { get; set; } [ImportingConstructor] public MyMainClass([Import(AllowDefault = true)] IContractInterface myParameter= null) : […]

带有ImportMany和ExportMetadata的MEF

我刚刚开始使用Managed Extensibility框架。 我有一个导出的类和一个import语句: [Export(typeof(IMapViewModel))] [ExportMetadata(“ID”,1)] public class MapViewModel : ViewModelBase, IMapViewModel { } [ImportMany(typeof(IMapViewModel))] private IEnumerable maps; private void InitMapView() { var catalog = new AggregateCatalog(); catalog.Catalogs.Add(new AssemblyCatalog(typeof(ZoneDetailsViewModel).Assembly)); CompositionContainer container = new CompositionContainer(catalog); container.ComposeParts(this); foreach (IMapViewModel item in maps) { MapView = (MapViewModel)item; } } 这很好用。 IEnumerable获取导出的类。 不,我尝试更改此项以使用Lazy列表并包含元数据,以便我可以过滤掉我需要的类(与以前相同的导出) [ImportMany(typeof(IMapViewModel))] private IEnumerable<Lazy> maps; private void InitMapView() […]

在Windows 8中获取类型程序集

我正在尝试在Windows 8中使用MEF。 为了构建容器的AssemblyCatalog ,我需要对程序集的引用。 在过去,我会这样做: var catalog = new AssemblyCatalog(typeof(App).Assembly); 神秘的是, Type对象上不再存在Assembly属性。 有人知道一个好的工作吗? 还有另一种方法来组装吗? 我可以使用Assembly.Load加载它,但我需要程序集的名称。 我不能从类型中得到那个。 使用DirectoryCatalog可能是替代? 我不喜欢这个主意,但我会做我需要的。

MEF和ShadowCopying DLL,以便我可以在运行时覆盖它们

我试图阻止我的应用程序锁定我的MEF插件目录中的DLL,以便我可以在运行时覆盖程序集(注意我实际上并没有尝试让MEF在运行时重新加载它们,在下一个应用程序启动很好,我只是不想要停止应用程序来复制) 我试图通过为我的mef加载的程序集创建一个阴影复制的应用程序域来执行此操作,如下所示: [Serializable] public class Composer:IComposer { private readonly string _pluginPath; public Composer(IConfigurePluginDirectory pluginDirectoryConfig) { _pluginPath = pluginDirectoryConfig.Path; var setup = new AppDomainSetup(); setup.ShadowCopyFiles = “true”; // really??? is bool not good enough for you? var appDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName + “_PluginDomain”, AppDomain.CurrentDomain.Evidence, setup); appDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkInShadowCopiedDomain)); } private void DoWorkInShadowCopiedDomain() { // This work will happen […]

是否可以将现有实例注入MEF插件?

我们正在创建一个使用MEF支持插件的应用程序。 我们正在确定用户能够创建什么类型的插件,并希望使用dependency injection来为这种类型的插件提供所需的数据。 例如,我们制作了一个能够显示列表的插件。 为了实现这一点,它需要IRepository的现有实例来显示列表将显示的数据类型。 IRepository是在datacontext类的其他地方创建的,因此我们无法让MEF自己创建IRepository的实例。 我的想法是通过importconstructor将现有的IRepository实例注入到插件中,但为了实现这一点,我需要让MEF知道已经实例化的IRepository,并且我无法弄清楚如何去做。 任何帮助,将不胜感激。

查找在调用ComposeParts后创建的对象的导出

我有一个非常简单的应用程序,只有一个导出和多个相同类型的导入。 在我调用ComposeParts之后,我可以看到导入工作在我调用ComposeParts的同一个类中–MyService属性已被连接。 问题是我有另一个需要访问MyService的UserControl并且没有设置属性 – 它在同一个包中等但是在我调用ComposeParts时没有实例化。 如果我将CompositionContainer设置为public / static并调用ComposeParts并传递UserControl,则设置MyService属性,但这是一个可怕的解决方案。 任何人都可以了解正在发生的事情吗? ComposeParts是否足够智能以挂接现有对象,或者导入属性是否能够在以后处理对象? 我错误地挂了什么吗? public partial class App : Application { protected override void OnActivated(EventArgs e) { AssemblyCatalog assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); compositionContainer = new CompositionContainer(assemblyCatalog); compositionContainer.ComposeParts(this); } [Import(typeof(MyService))] public MyService MyService { get; set; } } 更新: 我正在尝试将.b 2.0中的服务提供商模型的250k行C#项目升级到MEF。 您似乎无法通过Import属性自动将新对象实例连接到它所需的服务。 看起来你需要重新触发ComposeParts或类似的东西。 瘸。 在.Net 2.0提供程序/容器模型中,您需要将子对象显式添加到父容器,并且查找服务将是从子容器到父容器的递归检查。 我不确定MEF的证据是什么?

C#WCF插件的设计和实现

我想得到一些建议。 我正在开发一个系统,它将在运行时加载插件并要求它们通过WCF端点可用。 我将有一个仅用于配置的MVC 3 Web应用程序,以及将加载不同插件的类库(核心)。 我会很感激如何解决这个问题。 我想加载插件,然后能够创建一个在IIS 7中注册的WCF端点,以访问该插件。 提前致谢 :)