2016-12-15 57 views
0

我想實現一個簡單的依賴關係(在ASP.NET核心)Asp.net核心DI爲這樣:具有上下文

public partial class BaseController : Controller 
{ 
    public new ITempDataDictionary TempData { get; private set; } 

    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     base.OnActionExecuting(context); 

     //preparação da tempdata 
     this.TempData = new TempDataDictionary(HttpContext); //todo: DI? 
     this.TempData.Load(); 
    } 
} 

}

的問題是事實TempDataDictionary取決於HttpContext目前的在這個控制器中。 如何在DI中實現該場景,因爲ServiceLocator在啓動時不知道HttpContext

這樣?

services.AddScoped(); // ??????

但是,如果我填寫構造函數參數HttpContext,如果這只是在控制器?

+0

防止讓你的應用程序組件採取的直接依賴'HttpContext',如所描述的[這裏]( https://stackoverflow.com/questions/30055268/how-to-get-microsoft-aspnet-http-httpcontext-instance-in-class-constructor-using/30057522#30057522) – Steven

回答

0

你可以採取IHttpContextAccessor的依賴,並與DI註冊它

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

然後用它來獲得的HttpContext

然而,在一個控制器,你必須HttpContext的直接訪問,因此目前尚不清楚對我來說,爲什麼你想要在那裏注入它

+0

問題已更新。你再讀一遍嗎? –

0

你應該創建一個服務來處理你的狀態數據並將其添加爲作用域。

public class AppStateService 
{ 
    private readonly IHttpContextAccessor _httpContextAccessor; 
    private readonly ITempDataProvider _tempDataProvider; 
    private IDictionary<string, object> _data; 
    public AppStateService(IHttpContextAccessor httpContextAccessor, ITempDataProvider tempDataProvider, UserManager<EntsogUser> userManager, CompanyRepository companyRepository) 
    { 
     _httpContextAccessor = httpContextAccessor; 
     _tempDataProvider = tempDataProvider; 
     _data = _tempDataProvider.LoadTempData(_httpContextAccessor.HttpContext); 
    } 

    private void SetValue(string name, object value) 
    { 
     _data[name] = value; 
     _tempDataProvider.SaveTempData(_httpContextAccessor.HttpContext,_data); 
    } 

    private object GetValue(string name) 
    { 

     if (!_data.ContainsKey(name)) 
      return null; 
     return _data[name]; 
    } 
} 

在Startup.cs(ConfigureServices)

services.AddScoped<AppStateService>(); 

在控制器

public class TestController : Controller 
{ 

    protected readonly CompanyRepository _companyRepository; 

    public TariffsController(AppStateService appStateService) 
    { 
     _appStateService = appStateService; 
    } 
} 
相關問題