Если вы используете Ninject.Web.Common, у вас должен быть файл NinjectWebCommon.cs в папке app_start.Этот класс создает экземпляр класса Bootstrapper, который содержит одноэлементный экземпляр ядра Ninject.Это ядро Ninject действительно доступно везде в вашем приложении, что означает, что оно также доступно в фабричных классах HTTP.
Вот как вы можете продолжать использовать Ninject более или менее так же, как вы используете контроллеры:
IHttpHandlerFactory - это корень композиции для экземпляров IHttpHandler, поэтому вам нужно будет создать реализацию этого интерфейса и добавить необходимые элементы конфигурации в ваш web.config.
MyHandlerFactory.cs:
public class MyHandlerFactory : IHttpHandlerFactory
{
public bool IsReusable => false;
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
// the bootstrapper class uses the singleton pattern to share the Ninject Kernel across your web app's ApplicationDomain
var kernel = new Bootstrapper().Kernel;
// assuming you have only one IHttpHandler binding in your NinjectWebCommon.cs
return kernel.Get<IHttpHandler>();
}
public void ReleaseHandler(IHttpHandler handler)
{
// nothing to release
}
}
Теперь добавьте необходимые элементы конфигурации для вашей новой фабрики обработчиков ...
Web.config:
<system.web>
<httpHandlers>
<add verb="GET" path="*.customThingImade" type="MyNamespace.MyHandlerFactory, MyAssemblyWhereIPutMyHandlerFactory, Version=1.0.0.0, Culture=neutral" />
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="MyHandlerFactory" verb="GET" path="*.customThingImade" type="MyNamespace.MyHandlerFactory, MyAssemblyWhereIPutMyHandlerFactory, Version=1.0.0.0, Culture=neutral" preCondition="integratedMode" />
</handlers>
</system.webServer>
Наконец, добавьте привязку для вашей реализации IHttpHandler ...
NinjectWebCommon.cs:
private static void RegisterServices(IKernel kernel)
{
// other bindings you already have
// the binding for your handler factory
Bind<IHttpHandler>().To<NewHandler>();
}