如何从Http上下文会话中解耦控制器

时间:2011-03-24 17:32:33

标签: asp.net-mvc inversion-of-control loose-coupling

我需要在我的操作中的会话中存储一些数据但是我担心将我的控制器耦合到http上下文会话,我考虑过创建一个服务,但它真的值得吗?

2 个答案:

答案 0 :(得分:3)

不,这不值得。控制器可以访问包含会话的Http Context。更不用说你已经在使用会话的抽象:HttpSessionStateBase,可以在单元测试中轻松模拟。

在某些情况下,您可以让您的业务方法将ICollection作为输入参数,这是HttpSessionStateBase实现的接口,然后让控制器将Session对象传递给它们。

答案 1 :(得分:0)

特别是对于ApiControllers,请自己构建DelegatingHandler并将所有好处推送到request.Properties。无论您是在测试还是在线运行,您都可以从您的请求中检索它们。这样做的好处是,您可以在Controller中对Session进行零依赖。

的MessageHandler

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];