2010-07-30 4 views
2

Я искал какое-то время.Инъекция зависимостей с Ninject 2.0 для C# ASP.NET (NOT MVC)

Я не новичок в инъекции зависимостей и использовал StructureMap с несколькими проектами MVC и т. П., Но я чувствовал, что даю Ninject, чтобы не упустить удовольствие.

Я пытаюсь использовать Ninject с существующим веб-приложением, которое я обновляю.

Я не мог найти в блогах и вики, предоставленных Ninject, я немного нетерпелив, если честно, возможно, пропустил его, и первые несколько страниц google выглядят устаревшими или говорят об использовании MVC с Ninject.

До сих пор у меня есть следующее, и это работает, но я надеялся, что кто-то может указать на менее интрузивный вариант, касающийся вызова ServiceModule в ядро ​​и инъекции свойства с требуемым связыванием из веб-приложения.

То, что я до сих пор является ServiceModule:

public class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     Bind<IPreRegistrationService>().To<PreRegistrationService>() 
      .WithConstructorArgument("connectionString",connectionString); 
    } 
} 

Тогда в моей странице я определил приватную переменную:

private IPreRegistrationService xfemPreRegistrationService = null; 

Тогда в случае загрузки страницы:

IKernel kernel = new StandardKernel(new ServiceModule()); 
    xfemPreRegistrationService = kernel.Get<IPreRegistrationService>(); 

Так что это работает, но я хотел бы перейти к фазе, где все, что я определяю:

[Inject] 
public IPreRegistrationService xfemPreRegistrationService { get; set; } 

на странице, а остальное - магия.

Приветствия

ответ

2

Благодаря this stackoverflow post я узнал о продлении Ninject.Web

Проблема я обнаружил, что вам нужно, чтобы начать с помощью Ninject.Web, и я не мог, как я уже имеют PageBase определенные для обработки бумаги и такое.

Таким образом, единственный способ, которым я мог видеть взять KernelContainer class из проекта (как KernelContainer определяется как внутренняя):

Затем вызовите из глобального asax OnApplicationStart:

KernelContainer.Kernel = new StandardKernel(new ServiceModule()); 

// Request injections for the application itself. 
KernelContainer.Inject(this); 

Тогда в мой PageBase из метода OnInit:

KernelContainer.Inject(this); 

Это позволило мне достичь своей цели просто положить:

[Inject] 
public IPreRegistrationService xfemPreRegistrationService { get; set; } 

где необходимо

Смежные вопросы