Инъекция свойств HttpHandler с использованием Ninject, возвращающая null

2 Thomas [2010-09-02 20:12:00]

У меня есть следующий httphandler:

public class NewHandler : IHttpHandler
{
    [Inject]
    public IFile FileReader
    {
        get;
        set;
    }

    public NewHandler()
    {
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {
        ....
        var something = SomeMethod(FileReader);
        ....
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}

Это мой модуль Ninject в Global.asax.

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IFile>().To<FileWrapper>().InSingletonScope();
    }
}

Каждый раз, когда обработчик срабатывает, FileReader имеет значение NULL. Я что-то упускаю? Правильно ли это сделать инъекцию свойств с помощью Ninject?

Спасибо

ninject asp.net-mvc-2 ninject-2


1 ответ


3 Решение Necros [2010-09-02 20:41:00]

Это правильный способ сделать инъекцию свойств с помощью Ninject, но это не сработает. Вероятно, вы используете что-то вроде класса NinjectMvcApplication в качестве базового класса для вашего приложения, которое обрабатывает инъекцию зависимостей для контроллеров и все контроллеры могут использовать (службы, репозитории). Но HttpHandlers не создаются ControllerFactory, поэтому ничто не заботится о том, чтобы вводить материал.

Может быть, есть лучший способ сделать это, но я использовал локатор службы, чтобы разрешить зависимость. См. http://code.dortikum.net/2010/08/05/asp-net-mvc-di-with-common-service-locator-and-ninject/.

UPDATE:

Попробуйте что-то вроде этого:

public class NewHandler : IHttpHandler
{
    private readonly IFile _fileReader;

    public NewHandler()
    {
        _fileReader = ServiceLocator.Current.GetInstance<IFile>();
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {
        ....
        var something = SomeMethod(_fileReader);
        ....
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}