MVC5 und Ninject:Parameterlosen Konstruktor Fehler
In MVC 5 wir erhalten dieses Konto controller, der wie folgt aussieht.
public class AccountController : Controller
{
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
Habe ich installiert, Ninject mit meinem dependency injection. Ich habe zwei repositories, die ich verwenden möchte in meinem AccountController
und der code sieht nun wie folgt aus
public class AccountController : Controller
{
private readonly ILicenserepository _licenserepository;
private readonly IUserRepository _userRepository;
public AccountController(ILicenserepository licenserepository, IUserRepository userRepository)
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
_licenserepository = licenserepository;
_userRepository = userRepository;
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
in ninject.web.gemeinsames dies ist, was ich getan habe,
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof (ILicenserepository)).To(typeof (Licenserepository));
kernel.Bind(typeof (IUserRepository)).To(typeof (UserRepository));
}
aber wenn ich die Anwendung ausführen bekomme ich die Fehlermeldung, die auf browser -, die Nein sagt parametereless Konstruktor gefunden. Und wenn ich parameter weniger Konstruktor meine repositories nicht instanziiert werden. So, wo ich die Methode aufgerufen hat, aus dem repository der Wert null ist.
Wie kann ich dieses problem lösen? Oder machen Sie MVC oder Ninject wissen, mit welchem Konstruktor aufrufen?
- Ich habe nicht eine konkrete Lösung, auf die Spitze von meinem Kopf, aber Sie brauchen, um den code zu ersetzen, das schafft der Controller bei der Verwendung von dependency-injection JEGLICHER Art. In der Regel haben Sie die Implementierung eigener (einfacher) controller factory das injizieren der Abhängigkeiten, die Sie brauchen. Die Standard-Factory, benötigen weniger parameter von Konstruktoren können Sie auch verlängern, von
DefaultControllerFactory
(siehe msdn: msdn.microsoft.com/en-us/library/...) und lösen dort Abhängigkeiten. Dann registrieren Sie Ihr neues Werk auf die MVC5 - Sie können festlegen, dass die neuen controller via
ControllerBuilder.SetControllerFactory
(Link: msdn.microsoft.com/en-us/library/...). Hoffe es hilft - Und fwiw: erstellen Sie nicht
UserManager
innerhalb des Konstruktors, das macht die Klasse nicht UnitTest-in der Lage. Implementieren UserManager als Schnittstelle und passIUserManager
als nur in Abhängigkeit von der Klasse und lösen es über Ihre DI-framework
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie eine
DependencyResolver
registriert in Global.asax.csAnmeldung würde wie folgt Aussehen:
Und die
DependencyResolver
Dies ist ein update:
Wenn Ihr mit MVC5 und WebAPI 2, dann alle Sie tun müssen, ist die Verwendung von NuGet Manager und fügen Sie NinjectMVC5 und NinjectWebApi2 in Ihr Projekt. Dann ist der Fehler geht Weg. (Mit Visual Studio 2013)
Cheers
Ninject.Web.WebApi
undNinject.Web.WebApi.WebHost
von nuget oder die OwinHost Paket. Siehe stackoverflow.com/a/22774893/982237Nur ich habe diese arbeiten ohne Problem mit .NET MVC 5 und Ninject 3.3.4.
Schritte:
Controller
)(Optional) Api-Controller Schritte
ApiController
)ApiController
)Der wichtige Unterschied ist hier, ob Ihr Projekt verwendet Api-Controller-oder Mvc-Controller. Wenn Sie nicht vertraut mit dem Unterschied, bitte Lesen Sie den nachfolgenden Beitrag:
Unterschied zwischen ApiController und-Controller ASP.NET MVC.
Hinweis: ich habe nicht zu tun haben, jede zusätzliche Konfiguration auf meinem Ninject.Web.Common.cs-Datei. Unten ist meine Konfiguration weglassen meine Bindungen