Как использовать Ninject в приложении ASP.NET MVC для объектов, отличных от MVC

У меня есть проект ASP.NET MVC 3 с использованием Ninject (установка NuGet). Я пытаюсь понять, как я могу использовать его для внедрения зависимостей в объекты, отличные от MVC.

У меня есть код, похожий на приведенный ниже. Как я могу использовать Ninject для получения конкретного экземпляра IStore в объекте ниже?

public class SomeObject
{
    private static IStore _store;

    public static IStore CurrentStore
    {
        get 
        {
            if (_store == null)
            {
                // Get Instance of _store.
            }
            return _store; 
        }
    }
}

В Global.asax:

protected Application_BeginRequest()
{
    IStore store = SomeObject.CurrentStore;
} 

В NinjectWebCommon.cs:

    private static void RegisterServices(IKernel kernel)
    {
        // Module that binds a concrete type of IStore.
        kernel.Load<WebModule>();
    }

person Andrew McLachlan    schedule 12.04.2012    source источник


Ответы (2)


Для обработки запросов проще всего сделать это не в global.asax, а в IHttpModule. Там вы можете взять зависимости в качестве аргументов конструктора, если добавите привязку для HttpModule:

Bind<IHttpModule>().To<MyHttpModule>();
person Remo Gloor    schedule 12.04.2012
comment
Этот метод работает нормально, за исключением того, что я должен проверить _store на null и установить его значение в моем модуле, который будет запускаться для каждого запроса. Есть ли более чистый способ? - person Andrew McLachlan; 13.04.2012

Похоже, это сбивает с толку границу между контейнером DI и веб-приложением.

Что вам, вероятно, нужно, так это класс для извлечения хранилища. Затем этот класс может решить, откуда на самом деле получить хранилище. В нем также будет процедура инициализации, которую можно будет вызывать при запуске.

Таким образом, ваш модуль Ninject не получает код веб-приложения, вы можете настроить загрузку магазина в зависимости от контекста (например, тестирование может отличаться от производства).

person Simon Halsey    schedule 16.04.2012