首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过.NET内核上的MEF将参数传递给插件构造函数?

通过.NET内核上的MEF将参数传递给插件构造函数?
EN

Stack Overflow用户
提问于 2017-06-16 18:55:55
回答 2查看 1.4K关注 0票数 4

我花了几个小时试图弄清楚如何通过MEF (System.Composition)将参数传递给插件构造函数,但都没有效果。不用说,几乎没有相关的文档,通过查看源代码也没有帮助。

过去,使用CompositionHost.ComposeExportedValue方法很容易做到这一点,但在.NET核心版本中,我似乎找不到任何起作用的东西。我在下面附上了我的不完整代码,后面跟着抛出的异常。

如能在这方面提供任何帮助,将不胜感激。谢谢..。

代码语言:javascript
复制
using System;
using System.Composition;
using System.Composition.Hosting;
using System.Reflection;

namespace MefMe
{
    public interface IPlugin
    {
        void Alert();
    }

    [Export(typeof(IPlugin))]
    public class Plugin : IPlugin
    {
        private string code;

        [ImportingConstructor]
        public Plugin(string code)
        {
            this.code = code;
        }

        public void Alert() => Console.WriteLine(code);
    }

    class Program
    {
        static void Main(string[] args)
        {
            var config = new ContainerConfiguration()
                .WithAssembly(Assembly.GetEntryAssembly());

            var container = config.CreateContainer();

            // Throws a CompositionFailedException; see notes
            var plugin = container.GetExport<IPlugin>();

            plugin.Alert();
        }
    }
}

System.Composition.Hosting.CompositionFailedException发生 在初始请求“System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency依赖项”(IPlugin‘Source= StackTrace: at System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency dependency,HashSet1 checked, Stack1检查)的System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency依赖项下,为“插件”->的导入“代码”所需的合同'String’->,在System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency依赖项下找到了HResult=0x80131500 Message=No导出。( System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.Execute(CompositionContract合同) System.Composition.Hosting.Core.ExportDescriptorRegistry.TryGetSingleForExport(CompositionContract exportKey,ExportDescriptor& defaultForExport( System.Composition.Hosting.Core.LifetimeContext.TryGetExport(CompositionContract合同),在System.Composition.CompositionContext.GetExport(CompositionContract合同上)在System.Composition.CompositionContext.GetExportTExport at MefMe.Program.Main(String[] args)在C:\Users\louis\Desktop\MefMe\MefMe\Program.cs:line 36中

EN

回答 2

Stack Overflow用户

发布于 2017-08-01 17:03:13

不幸的是,目前不支持ComposeExportedValue。有一个开放的Github问题请求这个特性。

有一个长而有力的解决办法可以解决这个问题。我没有办法找到动态创建带有填充值的导出的方法。您可以做的是通过一个静态的参数包,使用构造函数中设置的值创建显式属性导出。我已经更新了您的代码片段以展示我的解决方案。

代码语言:javascript
复制
 namespace MefMe
{
    public interface IPlugin
    {
        void Alert();
    }

    [Export( typeof( IPlugin ) )]
    public class Plugin : IPlugin
    {
        private string code;

        [ImportingConstructor]
        public Plugin( [Import( "code" )] object code )
        {
            this.code = (string)code;
        }

        public void Alert() => Console.WriteLine( code );
    }

    public class Parameters
    {
        public static IEnumerable<Tuple<string, object>> PopulatedParameters { get; set; }
        [Export( "code", typeof( object ) )]
        public object code { get; set; }

        public Parameters()
        {
            foreach (var param in PopulatedParameters)
                SetParameter( param.Item1, param.Item2 );
        }

        void SetParameter( string nameOfParam, object value )
        {
            var property = typeof( Parameters ).GetProperty( nameOfParam, BindingFlags.Public | BindingFlags.Instance );
            property.SetValue( this, value );
        }


    }

    public class Program
    {           
        static void Main( string[] args )
        {
            Parameters.PopulatedParameters = new Tuple<string, object>[] { new Tuple<string, object>( "code", "myvalue" ) };

            var config = new ContainerConfiguration()
                .WithAssembly( typeof( IPlugin ).Assembly );
            var container = config.CreateContainer();

            // Throws a CompositionFailedException; see notes
            var plugin = container.GetExport<IPlugin>();

        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-08-18 04:02:00

现在,您需要构建自己的ExportDescriptorProvider。然后使用"WithProvider“将其添加到容器配置中。这是一个示例

(这个问题几乎完全相同。)

并不是说别人的工作值得赞扬;我只是认为堆栈溢出可以使用更多与System.Composition相关的材料。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44596189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档