[英]MEF and exporting based on Metadata
好吧,我很確定這是非常明顯的事情,但我沒有找到。
我正在嘗試根據它的元數據從 MEF 容器中導出一個對象。
我已經在這樣的教程中看到了這一點:
但是,我的導出沒有執行此操作所必需的 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();
更進一步,您可以將您的Export
和ExportMetadata
屬性合並為一個屬性:
[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.