C# MEF2中的强类型元数据(System.Composition)
我正在一个新的ASP.NET MVC4项目中使用来自的System.Composition命名空间 我在MEF2中已经说过,您不再使用C# MEF2中的强类型元数据(System.Composition),c#,asp.net-mvc,metadata,mef,C#,Asp.net Mvc,Metadata,Mef,我正在一个新的ASP.NET MVC4项目中使用来自的System.Composition命名空间 我在MEF2中已经说过,您不再使用Lazy,但现在必须为元数据视图提供一个具体的类型(并且可能使用ExportFactory而不是Lazy?) 然而,我找不到任何例子来说明这一切应该如何工作——只是提到了使用具体类型而不是接口 我已经尝试了一些方法,但不断出现以下错误-“缺少“AccountID”的导出元数据,并且没有提供默认值” 我的代码 正在创建容器(在Global.asax或App_Star
Lazy
,但现在必须为元数据视图提供一个具体的类型(并且可能使用ExportFactory而不是Lazy?)
然而,我找不到任何例子来说明这一切应该如何工作——只是提到了使用具体类型而不是接口
我已经尝试了一些方法,但不断出现以下错误-“缺少“AccountID”的导出元数据,并且没有提供默认值”
我的代码
正在创建容器(在Global.asax或App_Start文件夹中):
GetConventions()方法:
ExtensionMetadata.cs:
public class ExtensionMetadata
{
public int AccountID { get; set; }
}
ExtensionA.cs(与ExtensionB.cs相同):
ExtensionManager.cs:
public class ExtensionManager
{
private IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> _extensions;
public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> extensions)
{
_extensions = extensions;
}
public void DoWork(int accountID)
{
foreach (var extension in _extensions)
{
if (extension.Metadata.AccountID == accountID)
{
extension.DoWork();
}
}
}
}
公共类扩展管理器
{
私有IEnumerable_扩展;
公共扩展管理器(IEnumerable扩展)
{
_扩展=扩展;
}
公共作废DoWork(int accountID)
{
foreach(变量扩展在_扩展中)
{
if(extension.Metadata.AccountID==AccountID)
{
extension.DoWork();
}
}
}
}
我想我错过了一些重要的东西。基本上,我想惰性地导入所有扩展,检查它们的元数据,如果满足了条件,让该扩展做些什么
非常感谢您的反馈或任何有关我的场景的示例代码/教程的链接
非常感谢 我想我已经看完了 我创建了一个元数据属性:
[MetadataAttribute]
public class ExtensionMetadataAttribute : ExportAttribute, IExtensionMetadata
{
public int AccountID { get; set; }
public ExtensionMetadataAttribute(int accountID) : base(typeof (IExtension))
{
AccountID = accountID;
}
}
然后修改ExtensionA.cs:
[ExtensionMetadata(1)]
public class ExtensionA : IExtension
{
public void DoWork()
{
System.Diagnostics.Debug.WriteLine("ExtensionA doing work..");
}
}
现在ExtensionManager.cs如下所示:
public class ExtensionManager : IExtensionManager
{
private readonly IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> _extensions;
public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> extensions)
{
_extensions = extensions;
}
public void DoWork(int accountID)
{
foreach (var extension in _extensions)
{
if (extension.Metadata.AccountID == accountID)
{
using (var foo = extension.CreateExport())
{
foo.Value.DoWork();
}
}
}
}
}
公共类扩展管理器:IExtensionManager
{
私有只读IEnumerable\u扩展;
公共扩展管理器(IEnumerable扩展)
{
_扩展=扩展;
}
公共作废DoWork(int accountID)
{
foreach(变量扩展在_扩展中)
{
if(extension.Metadata.AccountID==AccountID)
{
使用(var foo=extension.CreateExport())
{
foo.Value.DoWork();
}
}
}
}
}
这似乎很管用,但我仍然对任何关于最佳实践、性能问题等的反馈感兴趣
谢谢 很好!它遵循有关自定义导出属性的指导原则,并根据MEF2中的更改进行更新,以便它也可以在Windows应用商店应用程序中工作。
public class ExtensionManager
{
private IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> _extensions;
public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> extensions)
{
_extensions = extensions;
}
public void DoWork(int accountID)
{
foreach (var extension in _extensions)
{
if (extension.Metadata.AccountID == accountID)
{
extension.DoWork();
}
}
}
}
[MetadataAttribute]
public class ExtensionMetadataAttribute : ExportAttribute, IExtensionMetadata
{
public int AccountID { get; set; }
public ExtensionMetadataAttribute(int accountID) : base(typeof (IExtension))
{
AccountID = accountID;
}
}
[ExtensionMetadata(1)]
public class ExtensionA : IExtension
{
public void DoWork()
{
System.Diagnostics.Debug.WriteLine("ExtensionA doing work..");
}
}
public class ExtensionManager : IExtensionManager
{
private readonly IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> _extensions;
public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> extensions)
{
_extensions = extensions;
}
public void DoWork(int accountID)
{
foreach (var extension in _extensions)
{
if (extension.Metadata.AccountID == accountID)
{
using (var foo = extension.CreateExport())
{
foo.Value.DoWork();
}
}
}
}
}