asp.net mvc - एएसपी.नेट एमवीसी 4 और एएसपी.नेट वेब एपीआई के साथ एमईएफ को एकीकृत कैसे करें




asp.net-mvc asp.net-mvc-4 (4)

एक ही प्रोजेक्ट में एएसपी.नेट एमवीसी 4 और एएसपी.नेट वेब एपीआई के साथ प्रबंधित एक्सटेंसिबिलिटी फ्रेमवर्क (एमईएफ) कैसे एकीकृत करता है?

एक एमवीसी नियंत्रक HomeController और एक वेब एपीआई नियंत्रक ContactController साथ एक उदाहरण अनुप्रयोग पर विचार करें। दोनों में IContactRepository की एक संपत्ति है, जिसे वे हल करने के लिए एमईएफ पर भरोसा करते हैं। समस्या यह है कि एमईएफ और वेब एपीआई में एमईएफ को कैसे प्लग करें, ताकि उदाहरण एमईएफ के माध्यम से बनाए जा सकें।

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();
    }
}

आईसीओन्टैक्ट रिपोजिटरी और संपर्क रिपोजिटरी:

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"}
        };
    }
}

संपर्क करें:

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
}

@ aknuds1 उत्तर सबसे अच्छा है जिसे मैंने एमईएफ को निर्भरता रिसेल्वर में एकीकृत करने के लिए अब तक देखा है। मैं इसे एमईएफ 2 में काफी आसानी से सम्मेलन-आधारित संरचना का उपयोग करने के लिए विस्तारित करने में सक्षम था। MefConfig क्लास वह सब कुछ है जिसे बदलने की जरूरत है और फिर बहुत कुछ नहीं।

/// <summary>
///     Responsible for configuring MEF for the application.
/// </summary>
public static class MefConfig
{
    /// <summary>
    ///     Registers MEF conventions and exports.
    /// </summary>
    public static void RegisterMef()
    {
        // Register MVC/API conventions
        var registrationBuilder = new RegistrationBuilder();
        registrationBuilder.ForTypesDerivedFrom<Controller>().SetCreationPolicy(CreationPolicy.NonShared).Export();
        registrationBuilder.ForTypesDerivedFrom<ApiController>().SetCreationPolicy(CreationPolicy.NonShared).Export();
        var assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), registrationBuilder);
        var aggregateCatalog = new AggregateCatalog(assemblyCatalog);
        var container = new CompositionContainer(aggregateCatalog);
        var resolver = new MefDependencyResolver(container);
        // Install MEF dependency resolver for MVC
        DependencyResolver.SetResolver(resolver);
        // Install MEF dependency resolver for Web API
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }
}

आप इस http://kennytordeur.blogspot.be/2012/08/mef-in-aspnet-mvc-4-and-webapi.html पर एक नज़र डाल सकते हैं। यह बताता है कि एएसपीनेट एमवीसी 4 / वेब एपीआई प्रोजेक्ट में एमईएफ का उपयोग कैसे करें। इस कोड के आधार पर एक Nuget पैकेज भी मौजूद है। इस तरह आप इसे बहुत आसानी से और जल्दी से परीक्षण कर सकते हैं।


यह एक आसान तरीका है जिसे मैं अपने एमवीसी 4 प्रोजेक्ट में उपयोग कर रहा हूं।

public static class MefConfig
{
     public static CompositionContainer MefContainer = null;

     public static void Initialise()
     {
          AggregateCatalog cat = new AggregateCatalog();
          cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
          MefContainer = new CompositionContainer(cat);
      }
}

public class MefFilterAttribute : ActionFilterAttribute
{
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
      MefConfig.MefContainer.ComposeParts(filterContext.Controller);
   }        
}

Application_Start में MefConfig चलाएं। प्रारंभ करें () और FilterConfig.RegisterGlobalFilters (GlobalFilterCollection फ़िल्टर) में फ़िल्टर डालें। जोड़ें (नए फ़िल्टर। MefFilterAttribute ());


श्री केनी टॉर्डुअर्स का समाधान मेरे लिए काम करता था, जबकि सही सही उत्तर नहीं था (नियंत्रक उदाहरण को हल नहीं कर सका हालांकि सभी आश्रित भागों catelog में हैं, मुझे "प्रकार का डिफॉल्ट कन्स्ट्रक्टर नहीं है" त्रुटि दी गई थी)!

सुधार : दोनों दृष्टिकोण वास्तव में काम करते हैं, मैं सम्मेलन भागों रजिस्ट्री में एक प्राथमिक गलती से बेवकूफ था। सही उत्तर के लेखक को मेरी ईमानदारी से माफी।







mef