Я прочитал десятки сообщений по этой теме, не найдя четких указаний о том, как получить доступ к Ninject.Kernel без использования шаблона Locator службы.
В настоящее время у меня есть следующие классы, которые должны использовать 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);
}
Это свойство ядра, доступное в коде выше:
public static IKernel Kernel
{
get
{
return CreateKernel();
}
}
Я читал много предложений об использовании factory для этого, но ни один из них не объясняет, как использовать этот factory. Я был бы очень признателен, если бы кто-нибудь мог показать мне "CustomerFactory" или любой другой рекомендуемый подход , включая, как использовать.
Обновление
Я использую веб-формы ASP.NET и должен получить доступ к CustomerBusiness
из CodeBehind.
Решение
Последнее решение, которое я нашел для работы, было ответом с большинством голосов, найденных на этом посту: Как я могу реализовать Ninject или DI на веб-формах asp.net?
Похоже, что это (Наследование наследования из PageBase, которое является частью Ninject.Web - это ключ!):
public partial class Edit : PageBase
{
[Inject]
public ICustomerBusiness CustomerBusiness { get; set; }
...
Принятый ответ ниже косвенно приводит меня к поиску этого решения.