OK Я уверен, что это нечто ослепительно очевидное, но я не нахожу этого.
Я пытаюсь экспортировать объект из контейнера 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().
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().
Where(exp => exp.Metadata.Name.Equals(controllerName) && exp.Metadata.Subdomain.Equals(subdomain)).
FirstOrDefault();
и я получаю
The Type 'ControllerMetadataAttribute' supplied is not a valid Metadata View.`
Как это не валидно. У него есть MetaDataAttribute и все такое?