Asp.net mvc 3 为什么赢了';是否在基类中解析受保护的属性?

Asp.net mvc 3 为什么赢了';是否在基类中解析受保护的属性?,asp.net-mvc-3,ninject,Asp.net Mvc 3,Ninject,我想这是个简单的问题,但我花了一个小时试图为我的控制器创建一个基类,以便通过属性注入注入一些服务。属性最初是受范围保护的,但对象总是返回null,一旦我将范围更改为public,它就工作了。是否有必要保护这些财产并让国际奥委会工作 这是我的设置 public class BaseController : Controller { [Inject] protected LoggingInterface.ILogger<BaseController> Logger { s

我想这是个简单的问题,但我花了一个小时试图为我的控制器创建一个基类,以便通过属性注入注入一些服务。属性最初是受范围保护的,但对象总是返回null,一旦我将范围更改为public,它就工作了。是否有必要保护这些财产并让国际奥委会工作

这是我的设置

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);
    }
}
公共类BaseController:控制器
{
[注入]
受保护的LoggingInterface.ILogger记录器{set;get;}
[注入]
受保护的IRepository存储库{set;get;}
授权时受保护的覆盖无效(AuthorizationContext filterContext)
{
....
基于授权(filterContext);
}
}
和NinjectMVC3应用程序中的引导程序启动

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind(typeof(LoggingInterface.ILogger<>)).To(typeof(Log4NetLogger<>));
        kernel.Bind<IRepository>().To<Repository>();
        kernel.Bind<IUserService>().To<UserService>();
    } 
私有静态无效注册服务(IKernel内核)
{
Bind(typeof(loggingcinterface.ILogger)).To(typeof(Log4NetLogger));
kernel.Bind().To();
kernel.Bind().To();
} 
谢谢,,
Stephen

您不能将注入到没有公共setter的属性中。记录器和存储库属性都受保护,因此Ninject无法为它们赋值。如果要实现这一点,必须更改其setter可见性。或者使用构造函数注入。虽然这对于似乎需要的repository属性来说非常有意义,但对于logger属性来说却没有意义。因此,我想您必须将其公开。

非常确定
NinjectSettings
上的
InjectNonPublic
标志允许您将其配置为执行所需操作-


我不知道它是否会在相当长的一段时间内得到支持——注射私人物品只是一个坏主意(连同财产注射和相关的恶棍:p)

谢谢Darin,这是我通过玩弄它得出的结论。属性的一个令人信服的原因是,子代会被ctor注入搞得一团糟。当心。