5 Stimmen

Warum löst Ninject geschützte Eigenschaften in einer Basisklasse nicht auf?

Einfache Frage, denke ich, aber ich habe eine Stunde damit verbracht, eine Basisklasse für meine Controller zu erstellen, um ein paar Dienste über die property injection bereitzustellen. Zuerst waren die Eigenschaften als geschützt deklariert, aber die Objekte kamen immer als null zurück. Sobald ich den Bereich auf öffentlich geändert habe, hat es funktioniert. Gibt es eine Möglichkeit, die Eigenschaften als geschützt zu belassen und das IoC zum Laufen zu bringen?

Hier ist meine Setup.

public class BaseController : Controller
{
    [Inject]
    protected LoggingInterface.ILogger Logger { set; get; }

    [Inject]
    protected IRepository Repository { set; get; }

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        ....

        base.OnAuthorization(filterContext);
    }
}

und der Bootstrapper in den NinjectMVC3 App_Start

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind(typeof(LoggingInterface.ILogger<>)).To(typeof(Log4NetLogger<>));
        kernel.Bind().To();
        kernel.Bind().To();
    } 

Vielen Dank, Stephen

6voto

Darin Dimitrov Punkte 990883

Sie können nicht in Eigenschaften injizieren, die keinen öffentlichen Setter haben. Sowohl Ihre Logger- als auch Ihre Repository-Eigenschaften sind geschützt, so dass Ninject ihnen keinen Wert zuweisen kann. Sie müssen die Sichtbarkeit ihres Setters ändern, wenn Sie dies erreichen möchten. Oder verwenden Sie Konstruktorinjektion. Während dies für die Repository-Eigenschaft, die erforderlich zu sein scheint, perfekt wäre, würde es für die Logger-Eigenschaft keinen Sinn ergeben. Daher denke ich, dass Sie es öffentlich machen müssen.

4voto

Ruben Bartelink Punkte 57310

Ziemlich sicher ermöglicht das InjectNonPublic-Flag in den NinjectSettings Ihnen, es so zu konfigurieren, wie Sie es möchten - der nächstliegende Link, den ich schnell finden kann

Ob es für eine längere Zeit unterstützt wird, weiß ich nicht - Privates injizieren ist keine gute Idee (genauso wie Property Injection und dazugehörige Halunken :P)

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