Come si può integrare Managed Extensibility Framework (MEF) con ASP.NET MVC 4 e API Web ASP.NET nello stesso progetto?Come integrare MEF con ASP.NET MVC 4 e API Web ASP.NET
Considerare un'applicazione di esempio, con un controller MVC HomeController
e un controller API Web ContactController
. Entrambi hanno una proprietà di tipo IContactRepository
, che si affidano a MEF per risolvere. Il problema è come collegare MEF a MVC e Web API, in modo che le istanze vengano create tramite MEF.
HomeController:
/// <summary>
/// Home controller. Instruct MEF to create one instance of this class per importer,
/// since this is what MVC expects.
/// </summary>
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller
{
[Import]
private IContactRepository _contactRepository = null;
public ActionResult Index()
{
return View(_contactRepository.GetAllContacts());
}
}
ContactController:
/// <summary>
/// Contact API controller. Instruct MEF to create one instance of this class per importer,
/// since this is what Web API expects.
/// </summary>
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ContactController : ApiController
{
[Import]
private IContactRepository _contactRepo = null;
public Contact[] Get()
{
return _contactRepo.GetAllContacts();
}
}
IContactRepository e ContactRepository:
public interface IContactRepository
{
Contact[] GetAllContacts();
}
[Export(typeof(IContactRepository))]
public class ContactRepository : IContactRepository
{
public Contact[] GetAllContacts()
{
return new Contact[] {
new Contact { Id = 1, Name = "Glenn Beck"},
new Contact { Id = 2, Name = "Bill O'Riley"}
};
}
}
Contatto:
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
}
funziona davvero, grazie. Per me ho appena cambiato un po 'il catalogo: var catalog = new AggregateCatalog(); catalog.Catalogs.Add (new DirectoryCatalog (@ ".. \ EducationBusinessLogic \ bin \ Debug", "*")); catalog.Catalogs.Add (nuovo AssemblyCatalog (Assembly.GetExecutingAssembly())); –
Sfortunatamente, la soluzione suggerita porta a perdite di memoria quando viene utilizzata per tipi di servizi 'IDisposable' non condivisi come' ApiController's a causa di http://stackoverflow.com/questions/8787982/mef-keeps-reference-of-nonshared -idisposable-parti-non-permettere-li-to-be-coll. Mi chiedo come la gente aggiri questo. – Dejan
FWIW, ho trovato che [Import] s non sono risolti nella classe ApiController a meno che la classe ApiController non venga esportata con un attributo [Export] sopra la dichiarazione della classe. – ThisIsTheDave