2011-11-07 8 views
5

Pregunta simple, supongo, pero he pasado una hora tratando de obtener una clase base para que mis controladores tengan unos servicios inyectados a través de la inyección de propiedad. Las propiedades tenían un ámbito protegido al principio, pero los objetos volvían a ser nulos, una vez que cambié el alcance a público funcionó. ¿Hay alguna forma de proteger las propiedades y hacer que el IoC funcione?¿Por qué Ninject no resuelve las propiedades protegidas en una clase base?

Aquí está mi configuración.

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); 
    } 
} 

y la bota strapper en el 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>(); 
    } 

Gracias, Stephen

Respuesta

6

No se puede inyectar en propiedades que no tienen colocador pública. Las propiedades de su Logger y Repository son protected, por lo que Ninject no tiene manera de asignarles un valor. Tendrás que cambiar su visibilidad setter si quieres lograr esto. O usa inyección de constructor Si bien esto tendría mucho sentido para la propiedad del repositorio que parece necesaria, no tendría sentido para la propiedad del registrador. Así que supongo que tendrás que hacerlo público.

+1

Gracias Darin, eso fue lo que concluí con solo jugar con él. La razón de peso de las propiedades es que los descendientes se vuelven locos con la inyección de ctor. Cuídate. –

4

Bastante seguro de la bandera InjectNonPublic en el NinjectSettings le permite configurarlo para hacer lo que quiera - closest link I can find quickly

Ya sea que va a ser apoyado por cualquier período significativo de tiempo, no sé - soldados inyectables es solo una mala idea (junto con Property Injection y sinvergüenzas asociadas: P)

Cuestiones relacionadas