【发布时间】:2011-03-24 17:32:32
【问题描述】:
我需要在我的操作中的会话中存储一些数据,但是我担心将我的控制器耦合到 http 上下文会话,我曾考虑过创建一个服务,但这真的值得吗?
【问题讨论】:
标签: asp.net-mvc inversion-of-control loose-coupling
我需要在我的操作中的会话中存储一些数据,但是我担心将我的控制器耦合到 http 上下文会话,我曾考虑过创建一个服务,但这真的值得吗?
【问题讨论】:
标签: asp.net-mvc inversion-of-control loose-coupling
不,不值得。它是可以访问包括会话在内的 Http 上下文的控制器。更不用说您已经在处理会话的抽象:HttpSessionStateBase,它可以在单元测试中轻松模拟。
在某些情况下,您可以让业务方法将ICollection 作为输入参数,这是由HttpSessionStateBase 实现的接口,然后让控制器将Session 对象传递给它们。
【讨论】:
特别是对于ApiControllers,为自己建立一个DelegatingHandler,并将你所有的好东西推送到request.Properties。然后,无论您是在测试还是实时运行,您都可以从您的请求中检索它们。这样做的好处是,您对 Controller 中的 Session 的依赖性为零。
public class ContextHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
// get the goodies to add onto the request
var goodies = /* call to goodieGoodieYumYum */
// add our goodies onto the request
request.Properties.Add(Constants.RequestKey_Goodies, goodies);
// pass along to the next handler
return base.SendAsync(request, cancellationToken);
}
}
var goodies = (List<Goodie>)Request.Properties[Constants.RequestKey_Goodies];
【讨论】: