如何从DI系统获取实例

本文关键字:获取 实例 系统 DI | 更新日期: 2023-09-27 18:10:51

我正试图在vNext中重新创建HttpContext.Current,但我遇到了麻烦。

目前的代码:

public class CurrentContext 
    {
        public IHttpContextAccessor ctx { get; private set; }
        public CurrentContext(IHttpContextAccessor accessor)
        {
            ctx = accessor;
        }
    }
services.AddTransient<CurrentContext>();

我想使用:

public static class UserFactory
{
    public static void SetCurrentUser(User u)
    {
        //tryed to get the context but GetService returns null
        IHttpContextAccessor _context = ((CurrentContext)CallContextServiceLocator.Locator.ServiceProvider.GetService(serviceType: typeof(CurrentContext))).ctx;
        //add the user to the Session
    }
}

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

如何从DI系统获取实例

我不使用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>();

但是如果你只使用上下文,为什么不直接依赖于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所说,通常你应该使用接口或抽象类而不是具体类。