Asp.net核心DI与上下文

时间:2016-12-15 12:26:26

标签: c# dependency-injection asp.net-core asp.net-core-mvc

我正在尝试实现一个简单的依赖(在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,如果它只存在于控制器中那么?

2 个答案:

答案 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,所以我不清楚你为什么要在那里注入它