ASP.NET Core 2 中 HttpContext.Current.Items.Contains(DataContextKey) 的替代方案

Jah*_*han 4 c# asp.net-core-mvc asp.net-core asp.net-core-2.0

我想将一些代码升级到ASP.NET Core 2. 我知道HttpContext.Current已从 中删除ASP.NET Core 2并且必须使用IHttpContextAccessor.

但我不知道应该如何替换这段代码:

HttpContext.Current.Items.Contains(DataContextKey)

我该怎么做?

完整代码:

namespace Jahan.Infrastructure.DataAccess.DataContextStorage
{
    public class HttpDataContextStorageContainer<T> : IDataContextStorageContainer<T> where T : class
    {
        private const string DataContextKey = "DataContext";

        public T GetDataContext()
        {
            T objectContext = null;
            if (HttpContext.Current.Items.Contains(DataContextKey))
            {
                objectContext = (T)HttpContext.Current.Items[DataContextKey];
            }
            return objectContext;
        }

        public void Clear()
        {
            if (HttpContext.Current.Items.Contains(DataContextKey))
            {
                HttpContext.Current.Items[DataContextKey] = null;
            }
        }

        public void Store(T objectContext)
        {
            if (HttpContext.Current.Items.Contains(DataContextKey))
            {
                HttpContext.Current.Items[DataContextKey] = objectContext;
            }
            else
            {
                HttpContext.Current.Items.Add(DataContextKey, objectContext);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 5

通过它注入IHttpContextAccessor并访问电流。HttpContext其余的应该足够简单以便重构。

例如。

public class HttpDataContextStorageContainer<T> : IDataContextStorageContainer<T> where T : class {
    private const string DataContextKey = "DataContext";
    private readonly IHttpContextAccessor accessor;

    public HttpDataContextStorageContainer(IHttpContextAccessor accessor) {
        this.accessor = accessor;
    }

    public T GetDataContext() {
        var current = accessor.HttpContext;
        T objectContext = null;
        if (current.Items.ContainsKey(DataContextKey)) {
            objectContext = (T)current.Items[DataContextKey];
        }
        return objectContext;
    }

    public void Clear() {
        var current = accessor.HttpContext;
        if (current.Items.ContainsKey(DataContextKey)) {
            current.Items[DataContextKey] = null;
        }
    }

    public void Store(T objectContext) {
        var current = accessor.HttpContext;
        if (current.Items.ContainsKey(DataContextKey)) {
            current.Items[DataContextKey] = objectContext;
        } else {
            current.Items.Add(DataContextKey, objectContext);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只需确保其实IHttpContextAccessor现已在服务容器中注册即可。默认情况下不再添加它。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)