【发布时间】:2012-08-08 22:07:40
【问题描述】:
我已经阅读了数十篇关于这个主题的帖子,但没有找到关于如何在不使用服务定位器模式的情况下访问 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 窗体,需要从 CodeBehind 访问 CustomerBusiness。
解决方案
我发现有效的最终解决方案是在这篇文章中找到的得票最多的答案: How can I implement Ninject or DI on asp.net Web Forms?
看起来像这样(注意从 PageBase 继承,它是 Ninject.Web 的一部分 - 这是关键!):
public partial class Edit : PageBase
{
[Inject]
public ICustomerBusiness CustomerBusiness { get; set; }
...
下面接受的答案间接引导我找到这个解决方案。
【问题讨论】:
标签: c# dependency-injection ninject