2011-11-07 14 views
5

To proste pytanie, ale spędziłem godzinę próbując uzyskać klasę podstawową dla moich kontrolerów, aby mieć kilka usług wstrzykniętych za pomocą wtrysku własności. Na początku właściwości były chronione, ale obiekty wracały null, kiedy zmieniłem zakres na publiczny, zadziałało. Czy mimo to należy zabezpieczyć właściwości i uruchomić IoC?Dlaczego Ninject nie naprawi zabezpieczonych właściwości w klasie bazowej?

Oto moja konfiguracja.

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

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

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

     base.OnAuthorization(filterContext); 
    } 
} 

a boot-byczek w NinjectMVC3 App_Start

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

Dziękuję Stephen

Odpowiedz

6

Nie można wstrzyknąć do właściwości, które nie mają setter publicznego. Zarówno właściwości rejestratora, jak i repozytorium są chronione , więc nie ma możliwości, aby program Ninject przydzielił im wartość. Będziesz musiał zmienić widoczność setera, jeśli chcesz to osiągnąć. Lub użyj wtrysku konstruktora. Chociaż byłoby to całkowicie sensowne dla właściwości repozytorium, które wydaje się wymagane, nie miałoby sensu dla właściwości rejestratora. Więc myślę, że będziesz musiał to upublicznić.

+1

Dzięki Darin, właśnie to zawarłem, bawiąc się z tym. Najważniejszym powodem dla właściwości jest to, że potomkowie są w pewien sposób sfałszowani zastrzykiem ctor. Dbać. –

4

całkiem pewny flaga InjectNonPublic na NinjectSettings umożliwia skonfigurowanie go do tego, co chcesz - closest link I can find quickly

Czy to ma być obsługiwane za każdym dłuższy czas, nie wiem - wstrzykiwanie szeregowców jest tylko zły pomysł (wraz z Injection Property i powiązanymi łobuzami: P)

Powiązane problemy