gpt4 book ai didi

asp.net-mvc - mvc将httpcontext注入(inject)服务层

转载 作者:行者123 更新时间:2023-12-01 02:21:17 25 4
gpt4 key购买 nike

在将 httpContextBase 注入(inject)到使用统一注入(inject) Controller 的服务级别对象中时,我遇到了一个大问题。

sample Controller

public HomeController : Controller{
private IWorkContext _context;

public HomeController(IWorkContext context){
_context = context;
}

}


public WorkContext : IWorkContext{

private HttpContextBase _httpContext;

public (HttpContextBase httpContext){
_httpContext = httpContext;
}

public void DealWithCookies(){
//do some thing with http context and deal with cookies
}
}

内部统一 Bootstrap
container.RegisterType<HttpContextBase>().RegisterInstance(new HttpContextWrapper(HttpContext.Current) as HttpContextBase, new ContainerControlledLifetimeManager());

//With this line httpcontextbase is returned but as a singleton instead of new for each request.


container.RegisterType<HttpContextBase>().RegisterInstance(new HttpContextWrapper(HttpContext.Current) as HttpContextBase, new PerRequestLifetimeManager());

//This line returns an exception

HttpContextBase 类型没有可访问的构造函数。

最佳答案

我不会注入(inject) HttpContext根本 - 我会将它传递给每个方法调用:

public WorkContext : IWorkContext{

private HttpContextBase _httpContext;

public WorkContext(){
...
}

public void DealWithCookies(HttpContext ctx){
//do some thing with http context and deal with cookies
}
}

在这里尝试使用依赖注入(inject)似乎是对我的原则的盗用。依赖注入(inject)允许您松散耦合您的组件,但这里不需要这样做,因为您可以将上下文传递给方法并直接操作它。没有提供具体实现的接口(interface),因此对 DI 没有任何好处 - 它只是不必要的引导和“反模式”缺乏结构。

更不用说您无论如何都无法做到这一点,因为当您在应用程序启动时注册您的类型时,没有要注册的实例(并且每个请求都需要更改实例)。

附带说明 - 我希望 IWorkContext仅用于抽象 cookie 逻辑,而不是您的应用程序和数据层之间的层。如果不是,它根本不应该依赖于 HTTP 上下文。

关于asp.net-mvc - mvc将httpcontext注入(inject)服务层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20335540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com