मैं सरल इंजेक्टर के साथ कुछ बुनियादी कन्स्ट्रक्टर डी करने का प्रयास कर रहा हूं, और ऐसा लगता है कि यह वेब एपीआई नियंत्रकों के लिए निर्भरताओं को हल करने में असमर्थ है।सरल इंजेक्टर वेब एपीआई नियंत्रकों में निर्भरता इंजेक्ट करने में असमर्थ
- मेरे पास "एपीआई" फ़ोल्डर में एक एपीआई नियंत्रक है, जो "नियंत्रक" फ़ोल्डर के बाहर है।
- मैंने इसे "नियंत्रक" फ़ोल्डर में रखने का भी प्रयास किया है, लेकिन जो कि बहुत अधिक अंतर नहीं लग रहा था। मुझे प्राप्त स्टैक ट्रेस this question में प्रस्तुत एक जैसा है।
- मैं "सरल इंजेक्टर एमवीसी एकीकरण त्वरित प्रारंभ" NuGet पैकेज (v। 2.1.0) का एक नया इंस्टॉल उपयोग कर रहा हूं।
- मेरे पास प्रलेखन से आधार
SimpleInjectorWebApiDependencyResolver
है, जो here जैसा भी है। - मैं इकाई फ्रेमवर्क का उपयोग कर रहा हूं, और संदर्भ को सही तरीके से लोड करने के लिए discussion thread पर परिवर्तनों के बारे में देखा है।
यह नहीं एक समस्या होने लगते है, लेकिन मैं अभी भी निम्न त्रुटि प्राप्त:
Type 'MyProject.API.ArticleController' does not have a default constructor
System.ArgumentException at
System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
अगर किसी ने मुझे कुछ सुझाव दे सकता है यह, की सराहना की जाएगी कि क्या कुछ भी से संशोधित किया जाना चाहिए इसका वर्तमान राज्य/कॉल ऑर्डर।
ArticleController (बुनियादी संरचना):
public class ArticleController : ApiController
{
private readonly IArticleRepository articleRepository;
private readonly IUserRepository userRepository;
private readonly IReleaseRepository releaseRepository;
public ArticleController(IArticleRepository articleRepository, IUserRepository userRepository, IReleaseRepository releaseRepository)
{
this.articleRepository = articleRepository;
this.userRepository = userRepository;
this.releaseRepository = releaseRepository;
}
// GET api/Article
public IEnumerable<Article> GetArticles(){ // code }
// GET api/Article/5
public Article GetArticle(int id){ // code }
// PUT api/Article/5
public HttpResponseMessage PutArticle(int id, Article article){ // code }
// POST api/Article
public HttpResponseMessage PostArticle(ArticleModel article){ // code }
// DELETE api/Article/5
public HttpResponseMessage DeleteArticle(int id){ // code }
}
SimpleInjectorInitializer:
public static class SimpleInjectorInitializer
{
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IArticleRepository, ArticleRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<IReleaseRepository, ReleaseRepository>();
}
}
Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
private void ConfigureApi()
{
// Create the container as usual.
var container = new Container();
// Verify the container configuration
// container.Verify();
// Register the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ConfigureApi();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
क्या आप वाकई 'कॉन्फ़िगरएपीआई' विधि वास्तव में चल रहे हैं? क्या आपने इसमें ब्रेक पॉइंट सेट किया था? – Steven
किसी भी कारण से आप अपनी वेब एपीआई कॉन्फ़िगरेशन के लिए एक अलग 'कंटेनर' उदाहरण बनाते हैं? – Steven
हां, मुझे यकीन है कि यह चल रहा है। मेरे पास लाइन पर एक ब्रेक पॉइंट सेट है जो ग्लोबल कॉन्फ़िगरेशन पर निर्भरता रीसोलवर सेट करता है। यदि आप Global.asax.cs के भीतर हैं, तो मैं इस मार्गदर्शिका का पालन कर रहा था (http://www.asp.net/web-api/overview/extensibility/using-the-web-api- निर्भरता-resolver), से देखें कि यह मेरी समस्या का समाधान करेगा या नहीं। हालांकि, ऐसा प्रतीत नहीं हुआ। – user1417835