HttpContext.Items vs Scoped Service

时间:2016-05-12 07:49:37

标签: asp.net-core

哪种方式更好地传输请求数据(两种方式之间有什么区别)?

例如:

选项1(Scoped Service):

//Scoped Service(this may be interface)
public class SampleScopedService
{
    public string Data { get; set; }
}

//Register service
services.AddScoped<SampleScopedService>();

//Set and Get Data
public class SampleUsage
{
    private readonly SampleScopedService _sampleScopedService;
    public SampleUsage(SampleScopedService sampleScopedService)
    {
        _sampleScopedService = sampleScopedService;
        // _sampleScopedService.Data = "Sample";
        // _sampleScopedService.Data 
    }
}

选项2(HttpContext.Items

//Scoped Service
public class SampleScopedService
{
    private readonly IHttpContextAccessor _accessor;

    public SampleScopedService(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
    public string GetData()
    {
        return (string)_accessor.HttpContext.Items["Data"];
    }
}

//Register service
services.AddScoped<SampleScopedService>();

//Set Data
HttpContext.Items[“Data”] = ”Sample”;

//Get Data
public class SampleUsage
{
    private readonly SampleScopedService _sampleScopedService;
    public SampleUsage(SampleScopedService sampleScopedService)
    {
        _sampleScopedService = sampleScopedService;
        //_sampleScopedService.GetData();
    }
}

1 个答案:

答案 0 :(得分:5)

根据docs

  

避免将数据和配置直接存储在DI中。例如,a   通常不应将用户的购物车添加到服务中   容器。配置应使用选项模型。同样的,   避免仅存在允许访问某些对象的“数据持有者”对象   其他对象。如果,最好通过DI请求实际需要的项目   可能的。

由于选项1 是“数据持有者”的示例,我们应尽可能避免使用。

此外,如果您不注意,选项1 可能会导致Captive Dependency

因此,使用选项2 与单身生命周期比使用选项1 更好。