2012-04-27 13 views
5

मैं Autofac WebAPI के साथ काम करने की कोशिश कर रहा हूँ। मेरे पास मुख्य वेब प्रोजेक्ट से एक अलग परियोजना में मेरे एपीकंट्रोलर हैं।ASP.NET WebAPI + Autofac नहीं मिल ApiControllers

InventorySystem.Web.UI InventorySystem.Web.Api.Controllers

जब भी मैं एक API मार्ग मैं प्रतिक्रिया प्राप्त करने के लिए ब्राउज़ करने के लिए प्रयास करें:

<Exception xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ExceptionType>System.ArgumentNullException</ExceptionType> 
    <Message>Value cannot be null. Parameter name: value</Message> 
    <StackTrace> 
at System.Web.Http.Controllers.HttpControllerContext.set_Controller(IHttpController value) 
at System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance(HttpControllerContext controllerContext, HttpControllerDescriptor controllerDescriptor) 
at System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateController(HttpControllerContext controllerContext, String controllerName) 
at Autofac.Integration.WebApi.AutofacControllerFactory.CreateController(HttpControllerContext controllerContext, String controllerName) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    </StackTrace> 
</Exception> 

जब मैं Autofac कोड मैं के माध्यम से कदम देखें कि मेरा नियंत्रक पंजीकृत है, लेकिन AutofacControllerActivator.Create() शून्य देता है। विशेष रूप से लाइन वापसी (ResolutionExtensions.ResolveOptional (गुंजाइश, controllerType) IHttpController के रूप में);

ऑटोफ़ैक कोड: स्ट्रिंग binDirectory = Path.Combine (HttpRuntime.AppDomainAppPath, "bin");

 var builder = new ContainerBuilder(); 

     builder.ConfigureWebApi(GlobalConfiguration.Configuration); 

     builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 
     builder.RegisterApiControllers(Assembly.LoadFile(Path.Combine(binDirectory, "InventorySystem.Web.Api.dll"))).PropertiesAutowired(); 
     builder.RegisterFilterProvider();    

     var container = builder.Build(); 

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

क्या मुझे कुछ याद आ रही है?

धन्यवाद

+0

क्या आप जिस असेंबली स्थान को RegisterAPIControllers को प्रदान कर रहे हैं वह निश्चित रूप से सही है? जब मैंने अपने असेंबली नाम के साथ गलती की तो मुझे वही त्रुटि मिली। – Gavin

+0

@ गैविन हां, क्योंकि मेरा एपिकंट्रोलर पंजीकृत हो जाता है। यह सिर्फ हल हो रहा है जो असफल लगता है। – user695595

उत्तर

0

आप निर्माण कंटेनर के साथ अपने एपीआई नियंत्रकों के लिए निर्माता निर्भरता रजिस्टर करने के लिए भूल रहे हैं?

HostingEnvironment.MapPath ("~/bin") बिन निर्देशिका में फ़ाइल का पथ प्राप्त करने के लिए एक और अच्छा तरीका है।

+0

दुर्भाग्य से इससे मदद नहीं मिली। – user695595

1

रजिस्टरएपी कंट्रोलर पंजीकरण एक्सटेंशन IHttpController इंटरफ़ेस को लागू करने वाले प्रकारों के लिए दिखता है और एक ऐसा नाम है जो "नियंत्रक" के साथ समाप्त होता है। क्या आपके नियंत्रक वर्ग के नामों में "नियंत्रक" का प्रत्यय है?

+0

हाँ, यह IHttpController अंत में लागू करता है और नाम भी नियंत्रक के साथ समाप्त होता है। इसके अलावा, अगर मैं मुख्य परियोजना में मेरी एपीआई नियंत्रक डाल यह ठीक काम करता है। मैं समस्या का प्रदर्शन करने के लिए एक परीक्षण परियोजना बनाने की कोशिश करूंगा। – user695595

+0

अगर lifetimeScope.ResolveOptional (controllerType) रिटर्न अशक्त या IHttpController लिए डाली मैं भी यकीन नहीं है। किसी भी तरह से मैं इसे आसानी से देख सकता हूं? – user695595

+0

(हम एक ही स्थान पर काम करते हैं, इस प्रकार मेरे पास कोड तक पहुंच है): builder.RegisterApiControllers (टाइपऑफ (इन्वेंटरी सिस्टम.बैब.एपीआई.कंट्रोलर। इन्वेंटरी कंट्रोलर)। एस्प्लोरस) .प्रॉपर्टीज्यूटर्ड(); इस मुद्दे को ठीक किया गया है, हालांकि हम असेंबली का उपयोग करने में सक्षम होना चाहते हैं। लोड करें ताकि हम कार्यान्वयन और क्या नहीं कर सकें। कृपया सलाह दें कि हम इस व्यवहार को क्यों देखते हैं। (और: ऑटोफैक एकीकरण मॉड्यूल के लिए धन्यवाद! हम ऑटोफैक से प्यार करते हैं और जो इसके साथ अच्छी तरह से एकीकृत होते हैं) –

2

आप इस SO question पर एक नज़र डालना चाहते हैं, जहां अन्य असेंबली एपीआई नियंत्रकों में से एक से शुरू होने वाली विधानसभा को उठाया जाता है।

0
var builder = new ContainerBuilder(); 
builder.Update(container); 
var webApiResolver = new Autofac.Integration.WebApi.AutofacWebApiDependencyResolver(container); 
    System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; 
संबंधित मुद्दे