[英]Integrate Simple Injector with optional ASP.NET Core Web API
[英]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);
}
例子:
有多種方法可以解決這個問題。 一種可能的解決方案是創建一個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.