Mud*_*auf 5 asp.net-mvc unity-container code-injection
在将 httpContextBase 注入到使用 unity 注入控制器的服务级别对象中时,我遇到了一个大问题。
样品控制器
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
}
}
Run Code Online (Sandbox Code Playgroud)
内部统一引导程序
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
Run Code Online (Sandbox Code Playgroud)
HttpContextBase 类型没有可访问的构造函数。
HttpContext我根本不会注入- 我会将它传递到每个方法调用中:
public WorkContext : IWorkContext{
private HttpContextBase _httpContext;
public WorkContext(){
...
}
public void DealWithCookies(HttpContext ctx){
//do some thing with http context and deal with cookies
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,尝试在这里使用依赖注入似乎是对该原则的盗用。依赖注入允许您松散地耦合组件,但这里不需要这样做,因为您可以将上下文传递到方法中并直接操作它。没有接口可以提供具体的实现,因此 DI 没有任何好处 - 它只是不必要的引导和缺乏结构的“反模式”。
更不用说您无论如何也无法执行此操作,因为当您在应用程序启动时注册类型时,没有要注册的实例(并且实例需要根据每个请求进行更改)。
附带说明 - 我希望这IWorkContext只是为了抽象 cookie 逻辑,而不是应用程序和数据层之间的层。如果不是,它根本不应该依赖于 HTTP 上下文。
| 归档时间: |
|
| 查看次数: |
2577 次 |
| 最近记录: |