У меня есть приложение mvc/webapi, которое я пытаюсь получить пользовательскую фабричную привязку с ninject. Мне нужно иметь доступ к HttpContext, из моего понимания, мне нужно иметь пользовательскую фабрику, чтобы использовать это.Создание фабрики с ninject для привязки HttpContextBase не получает ожидаемых значений
Так что я
public interface IHttpContextFactory
{
HttpContextBase Create();
}
public class HttpContextFactory:IHttpContextFactory
{
private readonly HttpContextWrapper _httpContext;
public HttpContextFactory(HttpContextWrapper contextWrapper)
{
_httpContext = contextWrapper;
}
public virtual HttpContextBase Create()
{
return _httpContext;
}
}
Я пытаюсь использовать завод в службе через
public class ApplicationService:IApplicationService
{
private readonly ILog _log;
private readonly IHttpContextFactory _contextFactory;
public ApplicationService(ILog log,IHttpContextFactory contextFactory)
{
_log = log;
_contextFactory = contextFactory;
if (_httpContextService == null)
{
throw new ArgumentNullException("httpContextService");
}
if (_log == null)
{
throw new ArgumentNullException("log");
}
}
public virtual string GetControllerName()
{
var factory = _contextFactory.Create();
var controllerName = factory.Request.RequestContext.RouteData.Values["controller"].ToString();
return controllerName;
}
}
Мой Ninject связывающими выглядит как
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
//Instruct the Kernel to rebind the HttpConfiguration to the default config instance provided from the GlobalConfiguration
kernel.Rebind<HttpConfiguration>().ToMethod(context => GlobalConfiguration.Configuration);
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IApplicationService>().To<ApplicationService>();
kernel.Bind<IHttpContextFactory>()
.To<HttpContextFactory>().WithConstructorArgument("contextWrapper",ninjectContext=> new HttpContextWrapper(HttpContext.Current));
}
}
Однако, если я ставлю точку останова на GetControllerName
контроллер недоступен в пределах RouteData.Values
.
Почему это так?
Что произойдет, если вы используете HTTPContext.Current напрямую? –