通过.NET Core上的MEF将参数传递给插件构造函数?
我花了几个小时试图弄清楚如何通过MEF(System.Composition)将参数传递给插件构造函数,但都无济于事。 毋庸置疑,相关文档很少,通过源代码看看也无济于事。
这曾经很容易使用CompositionHost.ComposeExportedValue方法,但在.NET Core版本中我似乎无法找到任何有用的东西。 我在下面附上了我的不完整代码,然后是抛出的exception。
在这方面的任何帮助将不胜感激。 谢谢….
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(); plugin.Alert(); } } }
发生了System.Composition.Hosting.CompositionFailedException
HResult = 0x80131500消息=没有找到合同’String’的导出 – >部分’插件’的导入’代码’所需 – >初始请求合同’IPlugin’所需的源Source = StackTrace:在System.Composition.Hosting。在System.Composition.Hosting.Core上的System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckDependency(CompositionDependency依赖项,HashSet1 checked, Stack
1检查)中的Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency依赖项,HashSet1 checked, Stack
1检查)。在System.Composition.Hosting.Core.ExportDescriptorRegistry.TryGetSingleForExport(CompositionContract exportKey,ExportDescriptor&defaultForExport)的System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.Execute(CompositionContract合约)中的ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency依赖项,HashSet1 checked, Stack
1检查)在System.Composition.Hosting.Core.LifetimeContext.TryGetExport(CompositionContract contract,Object&e) xport)位于C: Users louis Desktop中MefMe.Program.Main(String [] args)的System.Composition.CompositionContext.GetExport [TExport](String contractName)上的System.Composition.CompositionContext.GetExport(CompositionContract合约) MefMe MefMe Program.cs:第36行
很遗憾,目前不支持ComposeExportedValue
。 有一个开放的Github问题请求该function。
有一个冗长的解决方法可以解决这个问题。 我无法通过填充值来动态创建导出。 您可以做的是使用静态参数包在构造函数中设置的值创建显式属性导出。 我已更新您的代码段以显示我的解决方案。
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> 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[] { new Tuple( "code", "myvalue" ) }; var config = new ContainerConfiguration() .WithAssembly( typeof( IPlugin ).Assembly ); var container = config.CreateContainer(); // Throws a CompositionFailedException; see notes var plugin = container.GetExport(); } } }
现在,您需要构建自己的ExportDescriptorProvider。 然后使用“WithProvider”将其添加到容器配置中。 这是一个例子 。
(那几乎是完全相同的问题。)
不要因为任何人的工作而受到赞扬; 我只是认为stackoverflow可以使用更多与System.Composition相关的材料。
上述就是C#学习教程:通过.NET Core上的MEF将参数传递给插件构造函数?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/951572.html