c# – 在.NET Core上通过MEF将参数传递给插件构造函数?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在.NET Core上通过MEF将参数传递给插件构造函数?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3707字,纯文字阅读大概需要6分钟。
内容图文
我花了几个小时试图找出如何通过MEF(System.Composition)将参数传递给插件构造函数,但都无济于事.毋庸置疑,有很少的相关文档,通过源代码看看没有帮助.
这曾经很容易使用CompositionHost.ComposeExportedValue方法,但在.NET Core版本中我似乎无法找到任何有用的东西.我在下面附上了我的不完整代码,然后是抛出的异常.
在这方面的任何帮助将不胜感激.谢谢….
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 occurred
HResult=0x80131500 Message=No export was found for the contract
‘String’ -> required by import ‘code’ of part ‘Plugin’ -> required
by initial request for contract ‘IPlugin’ Source= StackTrace: at
System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency
dependency, HashSet1 checked, Stack
1 checking) at
System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckDependency(CompositionDependency
dependency, HashSet1 checked, Stack
1 checking) at
System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency
dependency, HashSet1 checked, Stack
1 checking) at
System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.Execute(CompositionContract
contract) at
System.Composition.Hosting.Core.ExportDescriptorRegistry.TryGetSingleForExport(CompositionContract
exportKey, ExportDescriptor& defaultForExport) at
System.Composition.Hosting.Core.LifetimeContext.TryGetExport(CompositionContract
contract, Object& export) at
System.Composition.CompositionContext.GetExport(CompositionContract
contract) at
System.Composition.CompositionContext.GetExport[TExport](String
contractName) at MefMe.Program.Main(String[] args) in
C:\Users\louis\Desktop\MefMe\MefMe\Program.cs:line 36
解决方法:
很遗憾,目前不支持ComposeExportedValue.有一个开放的Github Issue请求该功能.
有一个冗长的解决方法可以解决这个问题.我无法通过填充值来动态创建导出.您可以做的是使用静态参数包在构造函数中设置的值创建显式属性导出.我已更新您的代码段以显示我的解决方案.
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>();
}
}
}
内容总结
以上是互联网集市为您收集整理的c# – 在.NET Core上通过MEF将参数传递给插件构造函数?全部内容,希望文章能够帮你解决c# – 在.NET Core上通过MEF将参数传递给插件构造函数?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。