Внедрение свойства IHttphandler в MVC2 с использованием Ninject - PullRequest
2 голосов
/ 18 декабря 2010

Я ищу способ внедрения свойства в MVC для IHttpHandlers.

В случае отсутствия веб-форм, вы можете просто наследовать от HttpHandlerBase.

Это больше не работает, поскольку приложение теперь наследует от Ninject.Web.Mvc.NinjectApplication NOT Ninject.Web.NinjectHttpApplication.

Это приложение регистрирует типы для контроллеров, а не PageBase, MasterPageBase или HttpHandlerBase.

Мусор.

Возможно ли это сделать с помощью класса MvcHandler?

Пост, представленный ниже, является самым близким, к которому я пришел.

Внедрение свойства HttpHandler с использованием Ninject, возвращающего ноль

1 Ответ

2 голосов
/ 18 декабря 2010

Если вы собираете Ninject.Web.Mvc из исходного кода, включите копию класса HttpHandlerBase из Ninject.Web в пространство имен Ninject.Web.Mvc.

В противном случае ваш собственный HttpHandlerBase должен будет вызвать Kernel.Inject на себя.Ссылка на ядро ​​может быть получена через область приложения или с помощью отражения.

В HttpApplication.CreateKernel() сохраните экземпляр ядра в области приложения как «NinjectKernel».Затем добавьте следующее в качестве базового класса IHttpHandler.

public abstract class HttpHandlerBase : IHttpHandler
{
    public abstract void ProcessRequest( HttpContext context );

    void IHttpHandler.ProcessRequest( HttpContext context )
    {
        var kernel = (IKernel) context.Application["NinjectKernel"];
        kernel.Inject( this );

        this.ProcessRequest( context );
    }
}

Подход отражения не требует никакого кода в вашем HttpApplication.

public abstract class HttpHandlerBase : IHttpHandler
{
    public abstract void ProcessRequest( HttpContext context );

    void IHttpHandler.ProcessRequest( HttpContext context )
    {
        Assembly ass = Assembly.Load("Ninject.Web.Mvc");
        Type type = ass.GetType("Ninject.Web.Mvc.KernelContainer");
        MethodInfo init = type.GetMethod("Inject", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(object) }, null );
        init.Invoke( null, new object[] {} );

        this.ProcessRequest( context );
    }
}
...