我正在尝试实现一个简单的依赖(在ASP.NET Core中),如下所示:
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 :(得分:1)
您应该创建一个服务来处理您的状态数据并将其添加为作用域。
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;
}
}
答案 1 :(得分:0)
您可以依赖IHttpContextAccessor并将其注册到DI
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
然后用它来获取HttpContext
但是在控制器中你可以直接访问HttpContext,所以我不清楚你为什么要在那里注入它