C# 如何从DI系统获取实例?

C# 如何从DI系统获取实例?,c#,dependency-injection,asp.net-core,asp.net-core-mvc,C#,Dependency Injection,Asp.net Core,Asp.net Core Mvc,我正在尝试在vNext中重新创建HttpContext.Current,但遇到了问题 迄今为止的守则: public class CurrentContext { public IHttpContextAccessor ctx { get; private set; } public CurrentContext(IHttpContextAccessor accessor) { ctx = accessor;

我正在尝试在vNext中重新创建
HttpContext.Current
,但遇到了问题

迄今为止的守则:

public class CurrentContext 
    {
        public IHttpContextAccessor ctx { get; private set; }

        public CurrentContext(IHttpContextAccessor accessor)
        {
            ctx = accessor;
        }
    }

services.AddTransient<CurrentContext>();

我现在如何在项目中的任何地方获得
CurrentContext
的实例?

我不使用vNext DI系统,但我认为您应该为您的CurrentContext定义一个接口,例如

public interface IContextProvider {
     IHttpContextAccessor GetContext();
}
然后使用

public class CurrentContextProvider : IContextProvider
{
    private readonly IHttpContextAccessor _context;

    public CurrentContextProvider(IHttpContextAccessor accessor)
    {
        _context = accessor;
    }

    public IHttpContextAccessor GetContext() {
        return _context;
    }
}
和电线

services.AddScoped<IContextProvider, CurrentContextProvider>();
services.addScope();

但是,如果您只想使用上下文,为什么不直接依赖于
IHttpContextAccessor
-您需要它的地方?

您应该在依赖类的构造函数中声明
CurrentContext
类型的变量:

public class SomeClassThatUsesCurrentContext
{
    private readonly SomeClassThatUsesCurrentContext currentContext;

    public SomeClassThatUsesCurrentContext(CurrentContext currentContext)
    {
        if (currentContext == null)
            throw new ArgumentNullException("currentContext");

        this.currentContext = currentContext;
    }
}
这些类可能出现在其他类的构造函数中。最后,您通常从DI容器解析高级类的单个实例。你做这件事的地方叫做


而且,正如@janhartmann所说,通常你应该使用接口或抽象类而不是具体类。

你说在我需要的地方使用它,但我如何实例化
IHttpContextAccessor
?我在问如何获得注册服务的实例?您需要在哪里获得该实例?您应该依赖于所需类的构造函数中的
IHttpContextAccessor
(在我的示例中是
IContextProvider
)。控制器、自定义类等。我需要它在静态上下文中向用户会话添加/检索数据,如用户名或用户id(来自数据库),请使用该代码示例更新您的问题,以便我可以看到您正在尝试执行的操作。:-)vNext DI仅支持构造函数注入。服务定位器模式从一开始就是一个糟糕的实践。我在另一个地方仍然有相同的问题:现在如何创建使用当前上下文的某个类的实例?通常在ASP.NET MVC应用程序中,您应该实现控制器工厂。详细信息:我需要控制器外部的上下文。我已经在控制器中有了它。首先,使
UserFactory
成为可实例化(非静态)类。在构造函数中获取所有必需的类作为参数。要使类的单个实例使用DI库的生存期(生活方式、范围)功能。不要使用服务定位器,因为它是反模式的。如果您需要在非复合根目录的地方解析某些类,请重新设计您的解决方案。
public class SomeClassThatUsesCurrentContext
{
    private readonly SomeClassThatUsesCurrentContext currentContext;

    public SomeClassThatUsesCurrentContext(CurrentContext currentContext)
    {
        if (currentContext == null)
            throw new ArgumentNullException("currentContext");

        this.currentContext = currentContext;
    }
}