0

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

4

2 回答 2

3

不,这不值得。它是可以访问包括会话在内的 Http 上下文的控制器。更不用说您已经在使用会话的抽象:HttpSessionStateBase,它可以在单元测试中轻松模拟。

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

于 2011-03-24T17:34:13.793 回答
0

尤其是ApiControllers,建立自己一个DelegatingHandler并将你所有的好东西推到request.Properties。然后,无论您是在测试还是实时运行,您都可以从您的请求中检索它们。好处是您对控制器中的 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];
于 2014-02-04T11:22:25.993 回答