- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将一组基于 .NET Framework 的应用程序移植到 .NET Core,作为此过程的一部分,我需要从使用 MEF1 切换到 MEF2。我一直难以理解与 MEF2 相关的问题(尽管我发现 this post 真的很有帮助),但我最近偶然发现了其中一个问题背后的原因。
特别是,我有许多使用自定义 ExportAttribute
导出元数据的类我想将它们全部导入另一个类并根据此元数据过滤它们。这在 MEF1 中一切正常,但在 MEF2 中我遇到了诸如“x 的导出元数据丢失且未提供默认值”等问题。
更具体地说,我像下面这样注释导出的类:
[Export(typeof(IClientRequestProcessor<RelaySystemModel>))]
[TargetDevice("<<Foo>>")]
internal class RelaySystemClientRequestProcessor : IClientRequestProcessor<RelaySystemModel>
{
}
然后在其他地方,我将尝试像这样导入它们:
[ImportMany]
public IEnumerable<ExportFactory<IClientRequestProcessor<RelaySystemModel>, DeviceSpecific>> RelayRequestProcessors { private get; set; }
然后,在对导入满意后,尝试按元数据过滤它们:
private static IEnumerable<ExportFactory<T, DeviceSpecific>> FilterForFoo<T>(IEnumerable<ExportFactory<T, DeviceSpecific>> items)
{
return from it in items where it.Metadata.DeviceId == "<<Foo>>" select it;
}
在哪里TargetDeviceAttribute
定义如下:
[MetadataAttribute, AttributeUsage(AttributeTargets.Class)]
public class TargetDeviceAttribute : ExportAttribute, IDeviceSpecific
{
public TargetDeviceAttribute(string deviceId)
{
this.DeviceId = deviceId;
}
public string DeviceId { get; private set; }
}
我发现发生的事情是部分 RelaySystemClientRequestProcessor
对应于两个exports:IClientRequestProcessor<RelaySystemModel>
,这是我感兴趣的导出和我尝试导入零件的界面,以及 RelaySystemClientRequestProcessor
.但是,“DeviceId”元数据仅与后者而不是前者相关联,这没有帮助。
虽然我还没有完全测试,但我相信有几种方法可以解决这个问题:
应用属性 ExportMetadata("DeviceId", "<<foo>>")
到我所有的导出零件。
更改 TargetDeviceAttribute
使用构造函数 public TargetDeviceAttribute(string deviceId, Type exportType) : base(exportType)
.
我不赞成这些解决方案;如果我想更改元数据 key ,前者会有问题,并且两者都涉及更改我导出所有部分的方式。
我想知道 MEF2 是否提供了一种导出元数据的方法,就像在 MEF1 中一样:通过创建自定义元数据属性并将该元数据应用到与部件关联的所有 导出。这可能吗?
最佳答案
原来我只需要删除 6 个字符。与其让 TargetDeviceAttribute
继承自 ExportAttribute
,不如继承 Attribute
:
[MetadataAttribute, AttributeUsage(AttributeTargets.Class)]
public class TargetDeviceAttribute : Attribute, IDeviceSpecific
{
public TargetDeviceAttribute(string deviceId)
{
this.DeviceId = deviceId;
}
public string DeviceId { get; private set; }
}
在更一般的情况下,这意味着任何元数据都可以与多种可能的类型相关联,但应确保比 ExportAttribute("foo", "bar") 更好的静态类型安全性/可维护性
我应该做如下的事情吗:
public interface IMetadataExtension
{
string Foo { get; }
}
public class MetadataExtension : IMetadataExtension
{
public string Foo { get; set; }
}
[MetadataAttribute]
public class MetadataExtensionAttribute : Attribute, IMetadataExtension
{
public MetadataExtensionAttribute(string foo)
{
Foo = foo;
}
public string Foo { get; }
}
[Export]
[MetadataExtension("bar")]
public class SomeExport
{
}
关于c# - 为什么 MEF2 不将元数据属性应用于所有零件导出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39847880/
我有一个 Tizen Edje 文件,它定义了我的布局。其中一个部分是一张图像,其部分名称为“警告”。该项目在边缘文件中设置为可见,并且按预期显示。 我想使用 C 代码隐藏这部分: Evas_Obje
我正在开发一个 Eclipse RPC 项目。我需要保存和恢复所有 View 的所有内容。我没有在我的项目中使用 EMF,因此我无法使用所有 EMF API。 现在我可以使用的是IMemento。 I
我是一名优秀的程序员,十分优秀!