我猜这个问题很简单,但我花了一个小时试图为我的 Controller 获取一个基类,以便通过属性注入(inject)注入(inject)一些服务。属性最初的范围是 protected ,但是一旦我将范围更改为 public,对象就会一直返回 null,它就起作用了。无论如何要保护这些属性并让 IoC 工作吗?
这是我的设置。
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);
}
}
和 NinjectMVC3 App_Start 中的 Bootstrap
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof(LoggingInterface.ILogger<>)).To(typeof(Log4NetLogger<>));
kernel.Bind<IRepository>().To<Repository>();
kernel.Bind<IUserService>().To<UserService>();
}
谢谢,
斯蒂芬
最佳答案
您不能注入(inject)没有公共(public) setter 的属性。您的 Logger 和 Repository 属性都是 protected 所以 Ninject 没有办法给它们赋值。如果你想实现这一点,你将不得不改变他们的 setter 可见性。或者使用构造函数注入(inject)。虽然这对于似乎需要的存储库属性非常有意义,但对于 logger 属性没有意义。所以我想你必须把它公开。
关于asp.net-mvc-3 - 为什么 Ninject 不解析基类中的 protected 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8042654/