Frage

Ich habe ein Upgrade mein MVC2 Projekt MVC3 und die NuGet Bibliothekspaket Referenz verwendet installieren ninject. Dies entspricht einer AppStart Klasse erstellt, und ich verwendet, um den folgenden Code meine IMembershipService Klasse zu injizieren.

public static void RegisterServices(IKernel kernel) {
        kernel.Bind<IMembershipService>().To<AccountMembershipService>();
    }

Dies funktioniert gut mit meinem Homecontroller, zum Beispiel.

public class HomeController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public HomeController() : this(null) { }

    public HomeController(IMembershipService service)
    {
        MembershipService = service;
    }

Aber ich bin mit einem Base. Fast der gleiche Code in der Basisklasse nicht mehr funktioniert.

public class BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }
    public UserService UserService { get; set; }

    public BaseController() : this(null, null) { }

    public BaseController(IMembershipService service, UserService userService)
    {
        MembershipService = service;
        UserService = userService ?? new UserService();
    }

Wenn ich in dem Konstruktor der Basissteuerung brechen, den Service ist nur NULL. Ich habe noch nie Ninject für IOC so vielleicht die Antwort liegt auf der Hand, aber warum wird es nicht spritzt meine AccountMembershipController in der Basisklasse verwendet, wie ich will es? Ich sehe nicht, was anders ist, obwohl ich die zusätzliche Ebene der Vererbung erkennen kann irgendwie mit Ninject wird durcheinander.

War es hilfreich?

Lösung

Ich lief in das gleiche Problem selbst. Angenommen, Ihr Code sieht wie folgt aus:

public HomeController : BaseController
{

}

public BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public MembershipService() { }

    public MembershipService(IMembershipService service)
    {
        MembershipService = service;
    }
}

Aus irgendeinem Grund Ninject denkt, dass HomeController nur einen Konstruktor hat, man die Standard parameterlos. Wenn Sie alles in HomeController setzen, kann es den injizierbaren Konstruktor zu finden, aber es Faktor heraus in eine Basisklasse und aus irgendeinem Grund wird es nicht in der Basisklasse, um zu sehen, ob es irgendwelche ladenen Konstruktoren sind. Es gibt zwei Lösungen für dieses:

  1. Entfernen Sie den Standard-Konstruktor. Dies ist meine bevorzugte Lösung, da sie der Konstruktor zwingt injiziert werden (wie wenn Sie den Controller manuell, wenn Unit-Tests erstellen), aber der Nachteil ist, dass Sie den Konstruktor in allen Ihren Unterklassen zu implementieren.
  2. Halten Sie den Standard-Konstruktor, aber fügen Sie die [Inject] Attribut für alle Ihre injizierbare Eigenschaften:

    public BaseController : Controller
    {
        [Inject] public IMembershipService MembershipService { get;set; }
        // rest is the same
    }
    

Ninject die Eigenschaften korrekt auf diese Weise injizieren, aber beachten Sie, dass Ninject den parameterlosen Konstruktor nennen.

Andere Tipps

Ihre Homecontroller erkannt dervices von Controller nicht Base? Außerdem haben Sie einen Standardkonstruktor für Base dass Sätze Dinge als null. Warum haben Sie das alles? Ich würde beginnen mit diesen Standardkonstruktoren loszuwerden. Sie sollten keine Standardkonstruktoren müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top