构造函数中上下文类的依赖注入
本文关键字:依赖 注入 上下文 构造函数 | 更新日期: 2023-09-27 18:35:00
我有一个使用 ApplicationContext
的服务。所以我想使用依赖注入让应用程序为我提供上下文。所以我投入了建设
Private _context;
// Constructor
public Service(ApplicationContext context) {
_context = context
}
问题是当我初始化此服务时,我必须向它传递一个上下文,这样就不是真正的依赖注入,是吗?
有没有办法在不将其放入构造函数参数的情况下注入上下文?
******编辑*****
很抱歉我第一次没有提供足够的信息。让我试着更好地解释一下。我有一个服务,我现在只称之为服务。它读取请求中的标头变量,并根据它们的值返回 xml。我在控制器的每个不同方法中更新了一个实例,因为它们可能对标头变量具有不同的值。我希望将上下文注入服务而不是控制器,所以我可以这样说:
Service service = new Service(Request);
取而代之的是:
Service service = new Service(Request, Context);
原因是服务是在上下文中完成所有工作,控制器不需要知道任何关于它的信息。我拥有的代码将起作用,但如果我能按照我解释的方式工作,那就太好了。
如果我们还能[FromServices]
一个物业。这将是完美的解决方案。不幸的是,这被带走了。这只会留下将上下文注入服务或控制器的构造函数。在这种情况下,我仍然必须将上下文作为参数传递给服务。
有没有办法将上下文注入服务构造函数并避免在创建时将其作为参数传递?
可能有一个更优雅的解决方案,我很乐意考虑。
我的控制器只有一种方法,然后引入单独的构造函数只是为了节省ApplicationContext
没有任何优势。上下文将已保存在HttpContext
内,您可以使用[FromServices]
属性作为控制器操作的附加参数。请参阅文档。例如
[Route("api/[controller]")]
public class MyController : Controller
{
[HttpGet]
public async IEnumerable<object> Get([FromServices] ApplicationContext context,
MyType myMainParam)
{
...
}
}
RC1 允许使用[FromServices]
定义属性以从依赖注入获取信息,但 RC2 将不再允许这样做(请参阅公告(。您可以在答案中找到两种样式的示例。
它是对构造函数的依赖注入。使用 DI,不应直接初始化服务。您应该在 Startup.cs 中注册服务和应用程序上下文。
当你需要你的服务时,你应该通过构造函数将其注入到控制器中,DI 链会自动将 ApplicationContext 的实例注入到服务中。
当然,如果控制器中的每个方法都不需要服务,则可以按照@Oleg编写的方式将其初始化为方法。