5 Stimmen

Abhängigkeitsinjektion mit Ninject 3 in ASP.NET-Website

Ich habe die folgende Lösung versucht, die in Wie kann ich Ninject oder DI in asp.net Web Forms implementieren? (Jasons Antwort) gefunden wurde.

  1. Erstellen Sie ein neues ASP.NET WebForms-Projekt
  2. Verwenden Sie NuGet, um das Ninject.Web-Lib hinzuzufügen (das auch die Ninject.Web.Common- und Ninject-Libs herunterlädt)
  3. Registrieren Sie Ihre benutzerdefinierten Bindungen in App_Start / NinjectWebCommon.cs / RegisterServices-Methode
  4. Verwenden Sie Attributinjektion auf Ihren Seiten

Funktioniert großartig in ASP.NET-Webanwendungen.

Das Problem ist, dass ich Ninject für die DI in einer ASP.NET-Website verwenden möchte, nicht in einer Webanwendung.

Ich habe benutzerdefinierte Bindungen in NinjectWebCommon / RegisterServices registriert:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind().To();
}

In einer Webseite injiziere ich es:

public partial class _Default : System.Web.UI.Page
{
    [Inject]
    public ITestRepository _repository { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        System.Diagnostics.Trace.WriteLine(_repository.ExecuteOperation());
    }
}

Es wirft immer eine Null-Referenz-Ausnahme und der Haltepunkt innerhalb von NinjectWebCommon.cs wird nie erreicht - im Gegensatz zu einer Webanwendung.

Was muss noch getan werden, damit Ninject 3 in einer Website funktioniert?

9voto

Erik Funkenbusch Punkte 91649

Mein erster Ratschlag an dich ist...

Verwende kein ASP.NET-Websites. Vergiss, dass sie existieren. Vermeide sie um jeden Preis. Sie sind ein anachronistisches Überbleibsel vergangener Zeiten, das nur aus Gründen der Vererbung noch hier ist.

Mein zweiter Ratschlag wäre...

Wenn du darauf bestehst, weiterhin ein Webseitenprojekt zu verwenden, investiere schwer in Kopfschmerzmedikamente, denn du wirst sie brauchen.

Mein dritter Ratschlag wäre...

Siehe erster Ratschlag.

Mein vierter Ratschlag wäre...

Wenn du absolut keine Kontrolle darüber hast, ob es sich um ein Webseitenprojekt handelt oder nicht, dann verzichte einfach auf die Idee, Ninject oder einen anderen DI-Container zu verwenden. Webseitenprojekte erben von einem anderen Satz von Basisklassen als Webanwendungsprojekte. Du wirst es nicht so zum Laufen bringen und wirst wahrscheinlich viel Zeit damit verbringen, zu versuchen, es anzupassen.

BEARBEITEN:

Im Grunde genommen funktioniert das Code-Modell sehr unterschiedlich zwischen Webseiten und Webanwendungen. Du brauchst nur darauf zu achten, dass Webseitenanwendungen keine Namensräume haben, während Webanwendungen dies tun. Das sollte dir sagen, wie stark sich diese unterscheiden.

Ich bin mir nicht einmal sicher, ob der Aktivierungsprozess in beiden gleich funktioniert.

Trotzdem gibt es ein gravierendes Problem mit deinem Code. Deine Seite leitet von System.Web.UI.Page ab anstelle von Ninject.Web.PageBase.

1voto

Eric King Punkte 11152

Laut der anderen Frage, die du verlinkt hast, musst du deine Seite von Ninject.Web.PageBase erben lassen. Es sieht so aus, als ob deine Seite von System.Web.UI.Page erbt, was nicht weiß, wie es dein abhängiges Repository einbinden soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X