gpt4 book ai didi

c# - MEF 2 无法导入通用接口(interface)的通用实现

转载 作者:行者123 更新时间:2023-12-02 05:13:44 24 4
gpt4 key购买 nike

我正在使用来自 Codeplex homepage 的最新 MEF 2 预览版,它应该添加开放泛型支持。它确实如此,但在这种特定情况下,MEF 无法组合通用接口(interface)的通用实现:

public interface IOuter
{
IInner Value { get; }
}

[Export(typeof(IOuter))]
public class MyOuter : IOuter
{
[ImportingConstructor]
public MyOuter(InnerGenericClass<string, int> value)
{
this.Value = value;
}

public IInner Value { get; private set; }
}

public interface IInner
{
void Say();
}
public interface IGenericInner<T, K> : IInner
{
// something else here
}

[Export(typeof(IGenericInner<,>))]
public class InnerGenericClass<T, K> : IGenericInner<T, K>
{
public void Say()
{
Console.WriteLine("{0}, {1}", typeof(T), typeof(K));
}
}

class Startup
{
public void CatalogSetup()
{
var catalog = new AggregateCatalog(
new AssemblyCatalog(Assembly.GetExecutingAssembly())
);
var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection);

var batch = new CompositionBatch();

container.Compose(batch);

var outer = container.GetExportedValue<IOuter>();
outer.Value.Say();
}
}

这是CompositionExpection:

The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information.

1) No exports were found that match the constraint:
ContractName ConsoleApplication1.InnerGenericClass(System.String,System.Int32)
RequiredTypeIdentity ConsoleApplication1.InnerGenericClass(System.String,System.Int32)

Resulting in: Cannot set import 'ConsoleApplication1.MyOuter.Value (ContractName="ConsoleApplication1.InnerGenericClass(System.String,System.Int32)")' on part 'ConsoleApplication1.MyOuter'.
Element: ConsoleApplication1.MyOuter.Value (ContractName="ConsoleApplication1.InnerGenericClass(System.String,System.Int32)") --> ConsoleApplication1.MyOuter --> AssemblyCatalog (Assembly="ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

Resulting in: Cannot get export 'ConsoleApplication1.MyOuter (ContractName="ConsoleApplication1.IOuter")' from part 'ConsoleApplication1.MyOuter'.
Element: ConsoleApplication1.MyOuter (ContractName="ConsoleApplication1.IOuter") --> ConsoleApplication1.MyOuter --> AssemblyCatalog (Assembly="ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

即使我将 InnerGenericClass 的导入移动到 MyOuter.Value 的属性,也会引发相同的异常:

[Export(typeof(IOuter))]
public class MyOuter : IOuter
{
[Import(typeof(InnerGenericClass<string, int>))]
public IInner Value { get; private set; }
}

奇怪的是,当我将导入类型更改为 IGenericInner 时,它确实有效:

[Export(typeof(IOuter))]
public class MyOuter : IOuter
{
[ImportingConstructor]
public MyOuter(IGenericInner<string, int> value)
{
this.Value = value;
}

public IInner Value { get; private set; }
}

更奇怪的是,当通过属性导入时,它不起作用

总结:我不能使用通用接口(interface)将对象导入Value 属性,因为可能有更多IGenericInner 接口(interface)的实现(我还想导入一个特定的实现,但这并不重要)。

我希望在这种情况下我不必完全绕过 MEF。

最佳答案

导致你导出接口(interface) IGenericInner<> 但想导入具体类 InnerGenericClass MEF 没有找到正确的部分。您可以通过这种方式导出和导入特定类或创建 InnerGenericClass<> 的两个导出:

[Export(typeof(IGenericInner<,>))]
[Export(typeof(InnerGenericClass<,>))]
public class InnerGenericClass<T, K> : IGenericInner<T, K> {
public void Say() {
Console.WriteLine("{0}, {1}", typeof(T), typeof(K));
}
}

我刚刚在 VS .NET 4.5 项目中对此进行了测试,它可以正常工作。顺便提一句。 MEF 2 已在 .NET 4.5 中发布 - 如果可能,我建议使用框架的 System.ComponentModel.Composition.dll 部分而不是预览版。

更新:第三种解决方案(将与预览版 5 一起使用)可能是另外使用字符串合约名称。我个人试图避免这种丑陋语法的原因,但是没关系。代码将如下所示:

[Export(typeof(IOuter))]
public class MyOuter : IOuter {
[ImportingConstructor]
public MyOuter([Import("MySpecialInnerGenericClass", typeof(IGenericInner<,>))]InnerGenericClass<string, int> value) {
this.Value = value;
}

public IInner Value { get; private set; }
}
[Export("MySpecialInnerGenericClass", typeof(IGenericInner<,>))]
public class InnerGenericClass<T, K> : IGenericInner<T, K> {
public void Say() {
Console.WriteLine("{0}, {1}", typeof(T), typeof(K));
}
}

关于c# - MEF 2 无法导入通用接口(interface)的通用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14966946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com