簡體   English   中英

MEF 和基於元數據的導出

[英]MEF and exporting based on Metadata

好吧,我很確定這是非常明顯的事情,但我沒有找到。

我正在嘗試根據它的元數據從 MEF 容器中導出一個對象。

我已經在這樣的教程中看到了這一點:

http://blog.maartenballiauw.be/post/2009/04/21/ASPNET-MVC-and-the-Managed-Extensibility-Framework-%28MEF%29.aspx

但是,我的導出沒有執行此操作所必需的 Metadata 屬性。 那里可能有什么問題?

[Export(typeof(IController))]
[ExportMetadata("controllerName","Home")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller{}

然后再次

public class MyControllerFactory : IControllerFactory
{
    private readonly CompositionContainer _container;

    public MyControllerFactory(CompositionContainer container)
    {
        _container = container;
    }

    public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        var controllerExport = _container.GetExports<IController>().
                Where(exp => exp.Metadata) //Here it doesn't have the Metadata property.
    }
}

我知道 GetExports 返回一個 Lazy 集合,它當然沒有 Metadata 屬性,但在我瀏覽的大多數教程中都假定它是這樣。

我該如何正確地做到這一點?

編輯

這就是我所做的:

 public interface IControllerMetaData
{
    string Name { get; }
    string Subdomain { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class ControllerMetadataAttribute : ExportAttribute
{
    public ControllerMetadataAttribute(string name, string subdomain)
        : base(typeof(IControllerMetaData))
    {
        Name = name;
        Subdomain = subdomain;
    }

    public string Name { get; set; }
    public string Subdomain { get; set; }
}

然后在每個控制器中

[Export(typeof(IController))]
[ControllerMetadata("Home", "")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : SubdomainManagedController

並在工廠

var controllerExport = _container.GetExports<IController, ControllerMetadataAttribute>().
                                    Where(exp => exp.Metadata.Name.Equals(controllerName) && exp.Metadata.Subdomain.Equals(subdomain)).
                                    FirstOrDefault();

我得到

提供的類型“ControllerMetadataAttribute”不是有效的元數據視圖。`

怎么無效。 它有 MetaDataAttribute 嗎?

在您的示例中,您使用的是GetExports<T> ,而不是GetExports<T,TMetadata> 在一個簡單的示例中,您可以使用GetExports<IController, IDictionary<string, object>> ,它允許您進行查詢,但更好的方法是創建自定義元數據協定:

public interface INameMetadata
{
    string Name { get; }
}

然后您可以將其用作:

[Export(typeof(IController))]
[ExportMetadata("Name", "Home")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller { }

然后將您的導入更改為:

var controller = _container.GetExports<IController, INameMetadata>()
                           .Where(e => e.Metadata.Name.Equals(controllerName))
                           .Select(e => e.Value)
                           .FirstOrDefault();

更進一步,您可以將您的ExportExportMetadata屬性合並為一個屬性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false), MetadataAttribute]
public class ExportControllerAttribute : ExportAttribute, INameMetadata
{
    public ExportControllerAttribute(string name)
        : base(typeof(IController))
    {
        Name = name;
    }

    public string Name { get; private set; }
}

現在,您可以將其用於導出:

[ExportController("Home"), PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller { }

在我的情況下,錯誤在我需要刪除的模型內; 從財產和工作:

 public interface INamedMetadata { string ValidationRule { get; } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM