2017-12-23 34 views
1

いくつかのコードをASP.NET Core 2にアップグレードしたいと思います。 HttpContext.CurrentASP.NET Core 2から削除されており、IHttpContextAccessorを使用する必要があります。ASP.NET Core 2のHttpContext.Current.Items.Contains(DataContextKey)の代替手段

しかし、私はこのコードを交互にすべきかわからない:

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); 
      } 
     } 
    } 
} 

答えて

1

を注入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); 
     } 
    } 
} 

IHttpContextAccessorとその実装がサービスコンテナに登録されていることを確認してください。デフォルトではこれ以上追加されません。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();