簡體   English   中英

How can I get/create an instance of an object on Simple Injector container depending on the asp.net web api 2 session?

[英]How can I get/create an instance of an object on Simple Injector container depending on the asp.net web api 2 session?

我有一個 asp.net web api 2 項目,我在其中注冊了一個 Z2ED500A35299137175EZ675

containerLocal.RegisterSingleton<ILoginData>(
    () => new LoginData { LanguageCode = null, UserCode = null });

我想要做的是當用戶登錄應用程序時,我在我的容器中注冊該登錄數據的實例

var loginData = AppContainer.Container.GetInstance<ILoginData>();

loginData.UserCode = userData.Username;
loginData.LanguageCode = "es";

然后,在任何 controller 上讓該用戶實例執行任何操作

我的問題是,當我嘗試從 2 個不同的瀏覽器發出獲取請求時,我得到了在應用程序中創建的最后一個登錄數據實例,而不是具有正確用戶的實例

[Route("stock/menu")]
[HttpGet]
public async Task<IHttpActionResult> Menu()
{
    var loginData = AppContainer.Container.GetInstance<ILoginData>();
    return Ok(loginData);
}

例子:

  • 使用用戶名 'foo' 登錄 chrome 瀏覽器
  • 在 chrome 中對 InventarioMenu 發出獲取請求(使用用戶 'foo' 獲取 LoginData)
  • 使用用戶名“bar”登錄 firefox 瀏覽器
  • 在 firefox 的 InventarioMenu 上發出獲取請求(使用用戶“bar”獲取 LoginData)
  • 在 chrome 中對 InventarioMenu 發出獲取請求(使用用戶“bar”獲取 LoginData)

有多種方法可以解決這個問題。 一種可能的解決方案是創建一個ILoginData實現,將信息存儲在 Session 中:

public sealed class SessionLoginData : ILoginData
{
    public string UserCode
    {
        get { (string)this.Session[nameof(UserCode)]; }
        set { this.Session[nameof(UserCode)] = value; }
    }

    public string LanguageCode
    {
        get { (string)this.Session[nameof(LanguageCode)]; }
        set { this.Session[nameof(LanguageCode)] = value; }
    }

    private HttpSessionState Session => HttpContext.Current.Session;
}

Since this class itself contains no state (but delegates that to the HttpContext.Session ), this implementation can be registered as singleton:

container.RegisterSingleton<ILoginData, SessionLoginData>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM