C# 如何从DI系统获取实例?
我正在尝试在vNext中重新创建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;
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;
}
}