Внедрение зависимостей с Ninject 2.0 для C # ASP.NET (НЕ MVC) - PullRequest
2 голосов
/ 30 июля 2010

Я долго искал.

Я не новичок в внедрении зависимостей и уже использовал 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; }

на странице, а остальное - волшебство.

Приветствия

1 Ответ

2 голосов
/ 30 июля 2010

Благодаря этому сообщению переполнения стека Я узнал о расширении Ninject.Web

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

Итак, единственный способ, которым я мог видеть, - это взять класс KernelContainer из проекта (поскольку 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; }

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

...