2016-10-31 6 views
0

Ich schreibe eine Web-App und ich habe die Standard-Microsoft MVC-Site als Ausgangspunkt verwendet. Danach erstellte ich eine Datenbank mit Rezepten für die Verwendung in meiner Web-App mit Entity-Framework und habe ein Repository und einige Business-Layer-Methoden geschrieben. Ich habe dann die Abhängigkeitsinjektion mit Unity verwendet, um die Kopplung zwischen ihnen zu entfernen. Ich habe diesen Code in der MvcApplication-Klasse in global.asax.cs verwendet.Dependency Injection mit Einheit im Standard MVC bricht Anmelden

Die Bits, die mir gehören, sind nur die Bits, die sich auf Abhängigkeitsinjektion beziehen. .

Danach Benutzeranmeldungen im Zusammenhang jede Seite mit tun würde Rückgabe- und Fehler zB registrieren, melden Sie sich an Es würde einen Fehler zurück, betitelt dies:

The current type, Microsoft.AspNet.Identity.IUserStore`1[UKHO.Recipes.Www.Models.ApplicationUser], is an interface and cannot be constructed. Are you missing a type mapping? 

auf Ausnahme in Visual Studio geworfen Suche mit Diagnose ich Tools bekam dies:

"An error occurred when trying to create a controller of type 'UKHO.WeeklyRecipes.Www.Controllers.AccountController'. Make sure that the controller has a parameterless public constructor." 

AccountsContoler ist ein Controller von deafult erstellt, die ich nicht berührt haben und es enthält einen parameterlosen Konstruktor und anderen Konstruktor. Sie sehen wie folgt aus:

public AccountController() 
      { 
      } 


    public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager) 
      { 
       UserManager = userManager; 
       SignInManager = signInManager; 
      } 

von [InjectionConstructor()] vor dem parameterlosen Konstruktor setzen die Fehler weg ging. Es scheint mir, dass Unity versucht, den ApplicationUserManager und ApplicationSignInManager aufzulösen, obwohl ich diese Typen nicht registriert habe und dass das Setzen von [InjectionConstructor()] machte Einheit den leeren Konstruktor so nichts zu tun. Ich möchte hauptsächlich, warum dies passiert ist, da ich den Eindruck hatte, dass die Einheit nur die Typen stören sollte, die Sie registriert haben. Butter Lösungen sind ebenfalls willkommen.

Edit: Dies geschieht auch, wenn Sie eine Kontoeinstellung ändern möchten, aber stattdessen Fehler mit dem ManageContoler kann auch gelöst werden, indem [InjectionConstructor()] vor dem leeren Konstruktor setzen.

Antwort

0

Sie konfiguriert die Abhängigkeiten nur der folgenden Objekte:

Container.RegisterType<IRecipeRequest, BasicRecipeRequest>(); 
      Container.RegisterType<IRecipeRepository, RecipeRepositoryEntityFramework>(); 
      Container.RegisterType<IRecipeContext, RecipeContext>(); 

Aber auf dem Controller, Sie haben zwei Abhängigkeiten, die nicht konfiguriert ist, ApplicationUserManager und ApplicationSignInManager werden.

Unity kennt diese Abhängigkeiten nicht, daher kann es nicht auf den Konstruktor injizieren und versucht so, den parameterlosen Konstruktor aufzurufen.

Wenn Sie einen Konstruktor auf Ihrem Controller mit Parametern haben, sucht Unity danach und versucht, alle Abhängigkeiten aufzulösen, unabhängig davon, welche Sie konfiguriert haben. Wenn es ein Objekt findet, bricht es.