【问题标题】:Asp.net core DI with context带上下文的 Asp.net 核心 DI
【发布时间】:2017-09-18 01:48:48
【问题描述】:

我正在尝试实现一个简单的依赖项(在 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。 由于ServiceLocator 在启动时不知道HttpContext,如何在 DI 中实现该场景?

这样吗?

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

但是如果它只存在于控制器中,我在哪里填写构造函数参数HttpContext

【问题讨论】:

  • 防止让您的应用程序组件直接依赖于HttpContext,如here 所述

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


【解决方案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;
    } 
}

【讨论】:

    【解决方案2】:

    您可以依赖 IHttpContextAccessor 并将其注册到 DI

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    

    然后用它来获取HttpContext

    但是在控制器中,您可以直接访问 HttpContext,所以我不清楚您为什么要在那里注入它

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 2023-03-14
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多