我已经阅读了数十篇关于这个主题的帖子,但没有找到关于如何在不使用服务定位器模式的情况下访问 Ninject.Kernel 的明确指南。
我目前在需要使用的类中有以下内容CustomerBusiness
(这是我的服务)并且工作正常,但我很清楚这不是推荐的方法。
private CustomerBusiness _customerBusiness;
private ICustomerRepository CustomerRepository
{
get { return NinjectWebCommon.Kernel.Get<IAccountRepository>(); }
}
private CustomerBusiness CustomerBusiness
{
get
{
if (_customerBusiness == null)
{
_customerBusiness = new CustomerBusiness(AccountRepository);
}
return _customerBusiness;
}
}
public Customer GetCustomer(int id)
{
return CustomerBusiness.GetCustomer(id);
}
这是上面代码中访问的 Kernel 属性:
public static IKernel Kernel
{
get
{
return CreateKernel();
}
}
我已经阅读了很多关于为此使用工厂的建议,但没有一个解释如何使用这个工厂。如果有人能向我展示“CustomerFactory”或任何其他推荐的方法,包括如何使用它,我将不胜感激。
更新
我正在使用 ASP.NET Web 窗体,需要CustomerBusiness
从 CodeBehind 访问。
解决方案
我发现有效的最终解决方案是在这篇文章中获得最多票数的答案: 如何在 asp.net Web 表单上实现 Ninject 或 DI?
它看起来像这样(注意从 PageBase 继承,它是 Ninject.Web 的一部分 - 这是关键!):
public partial class Edit : PageBase
{
[Inject]
public ICustomerBusiness CustomerBusiness { get; set; }
...
下面接受的答案间接引导我找到这个解决方案。