2012-07-14 22 views
51

के साथ काम करने के लिए ऑटोफैक को कॉन्फ़िगर करना संभव है क्या एएसपी .NET एमवीसी और एएसपी .NET वेब एपीआई के साथ काम करने के लिए ऑटोफैक को कॉन्फ़िगर करना संभव है। मुझे पता है कि निर्भरता संकल्प अलग हैं। लेकिन दस्तावेज दृष्टिकोण का उपयोग करते समय मैं केवल एक वैश्विक रिज़ॉल्वर सेट कर सकता हूं।क्या एएसपी.नेट एमवीसी और एएसपी.नेट वेब एपीआई

// Set the dependency resolver implementation. 
GlobalConfiguration.Configuration.DependencyResolver = resolver; 

क्या यह दृष्टिकोण बुरा विचार है? क्या मुझे अपना समाधान दो परियोजनाओं में अलग करना चाहिए और प्रत्येक व्यक्ति के लिए निर्भरता इंजेक्शन को संभालना चाहिए?

+0

मेरे यहां न्यूनतम कार्यान्वयन है: http://byterot.blogspot.co.uk/2012/04/aspnet-web-api-series-part-4-dependency.html – Aliostad

उत्तर

82

यह निश्चित रूप से संभव है

यहाँ कैसे आप इस ASP.NET वेब API के साथ क्या हो सकता है ऑटोफैक को एमवीसी और वेब एपीआई दोनों के साथ काम करने के लिए कॉन्फ़िगर करने के लिए। यह एक बहुत ही आम परिदृश्य होने की उम्मीद है। दो अलग निर्भरता रिज़ॉल्वर कार्यान्वयन हैं क्योंकि एमवीसी और वेब एपीआई स्वतंत्र रूप से एक-दूसरे से उपयोग किया जा सकता है। ऑटोफैक एकीकरण के लिए भी यही लागू होता है।

उसी एप्लिकेशन में एमवीसी और वेब एपीआई दोनों का उपयोग करते समय प्रत्येक को अपने निर्भरता रिज़ॉल्यूवर की आवश्यकता होगी, हालांकि उन्हें कंटेनर के एक ही उदाहरण के साथ प्रदान किया जा सकता है।

var builder = new ContainerBuilder(); 

// Add your registrations 

var container = builder.Build(); 

// Set the dependency resolver for Web API. 
var webApiResolver = new AutofacWebApiDependencyResolver(container); 
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; 

// Set the dependency resolver for MVC. 
var mvcResolver = new AutofacDependencyResolver(container); 
DependencyResolver.SetResolver(mvcResolver); 

यह भी दोनों के बीच क्योंकि InstancePerApiRequest और InstancePerHttpRequest जीवन स्कोप अब एक ही टैग साझा पंजीकरण साझा करने के लिए संभव है।

ध्यान दें कि वेब एपीआई और एमवीसी के लिए निर्भरता रिज़ॉल्वर सेट करने के लिए तंत्र अलग है। वेब एपीआई GlobalConfiguration.Configuration.DependencyResolver का उपयोग करता है और एमवीसी DependencyResolver.SetResolver का उपयोग करता है।

+0

ग्रेट उत्तर। केवल एक चीज है "क्योंकि एमवीसी और वेब एपीआई स्वतंत्र रूप से एक दूसरे के लिए इस्तेमाल किया जा सकता है।" मुझे लगता है कि ऑटोफैक में एमवीसी और वेबपी के लिए अलग-अलग प्लगइन हैं क्योंकि दोनों के पास अलग-अलग रनटाइम है। – anIBMer

+0

वेबएपी प्रति ग्लोबल कॉन्फिगरेशन का उपयोग नहीं करता है, बल्कि यह 'एचटीपी कॉन्फ़िगरेशन' का उपयोग करता है, जो ओविन-आधारित परियोजनाओं के मामले में तुरंत तत्काल हो सकता है और इस प्रकार उपयोग किया जा सकता है: 'config.DependencyResolver = new AutofacWebApiDependencyResolver (...) '। –

4

निश्चित रूप से उन्हें अलग करें। ऑटोफैक में ASP.NET MVC और ASP.NET Web API दोनों एकीकृत हैं। यह हमेशा मामला नहीं है, लेकिन यदि आपको दोनों अनुप्रयोगों में एक ही सेवाओं की आवश्यकता है, तो संभवतः एप्लिकेशन आर्किटेक्चर में कुछ गड़बड़ है। तब Global.asax.cs अंदर नीचे के रूप में

internal class AutofacWebAPI { 

    public static void Initialize(HttpConfiguration config) { 

     config.DependencyResolver = new AutofacWebApiDependencyResolver(
      RegisterServices(new ContainerBuilder()) 
     ); 
    } 

    private static IContainer RegisterServices(ContainerBuilder builder) { 

     builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 

     //deal with your dependencies here 
     builder.RegisterType<CarsService>().As<ICarsService>(); 
     builder.RegisterType<CarsCountService>().As<ICarsCountService>(); 

     return builder.Build(); 
    } 
} 

, रजिस्टर इस:

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration); 
+1

यह सच है। एक ही प्रोजेक्ट में फ्रंट एंड और सर्विस कॉन्फ़िगरेशन को अलग करना बेहतर है। –

11

मैं मैं एक छोटे से मदद mvc5 और वेब एपीआई में इस के साथ संघर्ष कर उन 2.

पहले nuget संकुल

  • जोड़ने Autofac
  • Autofac asp.net MVC के 5 एकीकरण
  • जोड़ा जाने लगा कि
  • ऑटोफैक एएसपीनेट वेब एपीआई 2।Application_Start में एक्स एकीकरण

वैश्विक ऐड में (या app_start वर्ग के रूप में) के नीचे वर्ग के लिए कॉल जोड़ने

AutofacConfig.RegisterAutoFac(); 

अब प्रत्येक नए के लिए अब से App_start

using System.Reflection; 
using System.Web.Http; 
using System.Web.Http.Controllers; 
using System.Web.Mvc; 
using Autofac; 
using Autofac.Integration.Mvc; 
using Autofac.Integration.WebApi; 

namespace Example1.Web 
{ 
    public class AutofacConfig 
    { 
     public static IContainer RegisterAutoFac() 
     { 
      var builder = new ContainerBuilder(); 

      AddMvcRegistrations(builder); 
      AddRegisterations(builder); 

      var container = builder.Build(); 

      DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
      GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

      return container; 
     } 

     private static void AddMvcRegistrations(ContainerBuilder builder) 
     { 
      //mvc 
      builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
      builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); 
      builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); 
      builder.RegisterModelBinderProvider(); 

      //web api 
      builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 
      builder.RegisterModule<AutofacWebTypesModule>(); 
     } 

     private static void AddRegisterations(ContainerBuilder builder) 
     { 
      //builder.RegisterModule(new MyCustomerWebAutoFacModule()); 
     } 
    } 
} 

के तहत इस वर्ग को जोड़ने प्रोजेक्ट में जो असेंबली आप जोड़ते हैं, वह एक नया मॉड्यूल जोड़ता है और फिर मॉड्यूल को AddRegisterations फ़ंक्शन में दर्ज करता है (उदाहरण दिया गया)

नोट:

मैंने कंटेनर वापस कर दिया, यह आवश्यक नहीं है।

यह मॉड्यूल के लिए वर्तमान असेंबली स्कैन करता है इसलिए अतिरिक्त पंजीकरण में स्थानीय मॉड्यूल नहीं जोड़ें अन्यथा आप सबकुछ दो बार पंजीकृत करेंगे।

+1

धन्यवाद। आखिर में कोई ऐसा व्यक्ति जो इसे यहां देता है, मैं विचारों को लागू किए बिना समझने में आसान हूं। – punkologist

संबंधित मुद्दे