2016-05-19 16 views
0

静的なクラスにgeneric addReplaceCookieメソッドを作成しようとしています。この方法は、私はasp.netコアにHttpContextを得るためにあなたがIHttpContextAccessorを使用する必要があることを知っているこの静的クラスのIHttpContextAccessorを使用してクッキーを設定する方法

public static void addReplaceCookie(string cookieName, string cookieValue) 
{ 

    if ((HttpContext.Current.Request.Cookies(cookieName) == null)) 
    { 
     // add cookie 
     HttpCookie s = new HttpCookie(cookieName); 
     s.Value = cookieValue; 
     s.Expires = DateTime.Now.AddDays(7); 
     HttpContext.Current.Response.Cookies.Add(s); 
    } 
    else { 
     // ensure cookie value is correct 
     HttpCookie existingSchoolCookie = HttpContext.Current.Request.Cookies(cookieName); 
     existingSchoolCookie.Expires = DateTime.Now.AddDays(7); 
     existingSchoolCookie.Value = cookieValue; 
     HttpContext.Current.Response.Cookies.Set(existingSchoolCookie); 
    } 

} 

ようになります。しかし、私は静的なクラスに注入することはできません。

別の方法でアクセスできますか?

私はrc1-finalを使用しています。

+0

静的クラスなので、サービスコレクションの設定時にインタフェースを受け取り、渡すinitializeメソッドを作成できます。 – Nkosi

答えて

3

私は離れて、このような静的クラスのシナリオから滞在助言するだろうが、あなたが求めているものを達成することが可能です。

メソッドでは、と呼んで、IServiceProviderを入力して、探しているタイプを解決することができます。ハックのビットですが、うまくいきます。それが終わって今

public IServiceProvider ConfigureServices(IServiceCollection service) { 
    services.AddTransient<IMyService, MyService>(); 
    services.AddMvc(); 

    //this would have been done by the framework any way after this method call; 
    //in this case you call the BuildServiceProvider manually to be able to use it 
    var serviceProvider = services.BuildServiceProvider(); 

    //here is where you set you accessor 
    var accessor = serviceProvider.GetService<IHttpContextAccessor>() 
    MyStaticHelperClass.SetHttpContextAccessor(accessor); 

    return serviceProvider; 
} 

を起動時に静的クラスなどを想定すると

...

public class MyStaticHelperClass { 
    private static IHttpContextAccessor httpContextAccessor; 
    public static void SetHttpContextAccessor(IHttpContextAccessor accessor) { 
     httpContextAccessor = accessor; 
    } 

    public static void addReplaceCookie(string cookieName, string cookieValue) { 
     var HttpContext = httpContextAccessor.HttpContext; 
     if (HttpContext.Request.Cookies(cookieName) == null) { 
      // add cookie 
      HttpCookie s = new HttpCookie(cookieName); 
      s.Value = cookieValue; 
      s.Expires = DateTime.Now.AddDays(7); 
      HttpContext.Response.Cookies.Add(s); 
     } else { 
      // ensure cookie value is correct 
      HttpCookie existingSchoolCookie = HttpContext.Request.Cookies(cookieName); 
      existingSchoolCookie.Expires = DateTime.Now.AddDays(7); 
      existingSchoolCookie.Value = cookieValue; 
      HttpContext.Response.Cookies.Set(existingSchoolCookie); 
     } 
    } 
} 

あなたのクラスを構成します。静的クラスをコンストラクタ経由で注入できる依存関係として具体的な実装でIHttpContextAccessorを使用するサービスに変換することを強くお勧めします。

public interface ICookieService { 
    void AddReplaceCookie(string cookieName, string cookieValue); 
} 

public class CookieService : ICookieService { 
    IHttpContextAccessor httpContextAccessor; 
    public CookieService(IHttpContextAccessor httpContextAccessor) { 
     this.httpContextAccessor = httpContextAccessor; 
    } 
    public void AddReplaceCookie(string cookieName, string cookieValue) { 
     var HttpContext = httpContextAccessor.HttpContext; 
     if (HttpContext.Request.Cookies(cookieName) == null) { 
      // add cookie 
      HttpCookie s = new HttpCookie(cookieName); 
      s.Value = cookieValue; 
      s.Expires = DateTime.Now.AddDays(7); 
      HttpContext.Response.Cookies.Add(s); 
     } else { 
      // ensure cookie value is correct 
      HttpCookie existingSchoolCookie = HttpContext.Request.Cookies(cookieName); 
      existingSchoolCookie.Expires = DateTime.Now.AddDays(7); 
      existingSchoolCookie.Value = cookieValue; 
      HttpContext.Response.Cookies.Set(existingSchoolCookie); 
     } 
    } 
} 

...それは、その後

public void ConfigureServices(IServiceCollection service) { 
    services.AddTransient<ICookieService, CookieService>(); 
    services.AddMvc(); 
} 

...サービスのコレクションに登録...そして、それの使用を必要としているクラスに注入するための利用可能であることができます。

public class SomeClassThatNeedCookieServicesController : Controller { 
    ICookieService cookieService; 

    public SomeClassThatNeedCookieServicesController(ICookieService cookieService) { 
     this.cookieService = cookieService; 
    } 
} 

これは、アプリケーションでセッションCookieを管理する方法です。

+0

素晴らしい、私はそれを取得し始めていると思う。あなたは、asp.netコアのクッキーを置き換える方法があるのか​​、それとも自動的にそれを置き換えるかを知っていますか? – user973671

+0

追加の意味は?私は上手く理解できていない気がします。私は通常、それが意味するものなら 'Response.Cookies.Set(cookie)'を使用します。クッキーにはキーと値があります。 – Nkosi

+0

さて、何らかの理由でResponse.Cookies.Setが私のためにエラーを投げています。 Response.Cookies.Append(cookieName、cookieValue、CookieOption)を使用する必要があります。しかしそれは大丈夫です。ご協力いただきありがとうございます! – user973671

1

可能であれば、static classを使用しないでください。しかし、使用する必要がある場合は、パラメータとしてIHttpContextAccessorを送信することが解決策になる可能性があります。

public static void addReplaceCookie(string cookieName, string cookieValue, IHttpContextAccessor accessor) 
{ 
    //your code 
} 
public class CallerClass 
{ 
    private readonly IHttpContextAccessor _accessor; 

    public CallerClass(IHttpContextAccessor accessor) 
    { 
     _accessor = accessor; 
     addReplaceCookie(cookieName, cookieValue, accessor); 
    } 
} 
関連する問題