Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MEF2中的强类型元数据(System.Composition)_C#_Asp.net Mvc_Metadata_Mef - Fatal编程技术网

C# MEF2中的强类型元数据(System.Composition)

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

我正在一个新的ASP.NET MVC4项目中使用来自的System.Composition命名空间

我在MEF2中已经说过,您不再使用
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();
                }
            }
        }
    }
}