如何从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
的实例?
我不使用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所说,通常你应该使用接口或抽象类而不是具体类。