构造函数

时间:2016-02-17 02:41:55

标签: c# dependency-injection asp.net-core-mvc entity-framework-core

我有一项使用ApplicationContext的服务。所以我想使用依赖注入让应用程序给我上下文。所以我加入了构造

Private _context;

// Constructor
public Service(ApplicationContext context) {
    _context = context
}

问题是,当我初始化这个服务时,我必须传递一个上下文,这样它不是真正的依赖注入吗?

有没有办法在不将它放入构造函数参数的情况下注入上下文?

******编辑*****

对不起,我第一次没有提供足够的信息。让我试着更好地解释一下。我有一项服务,我现在只打电话给服务。它读取请求中的头变量,并根据它们的值返回xml。我在控制器的每个不同方法中新建一个实例,因为它们可能具有不同的标头变量值。我想将上下文注入服务而不是控制器,所以我可以这样说:

Service service = new Service(Request);

而不是:

Service service = new Service(Request, Context);

服务的原因是在控制器不需要了解任何内容的情况下完成所有工作。我所拥有的代码将起作用,但如果我能按照我解释的方式工作,那将会很棒。

如果我们仍然可以在属性上[FromServices]。那将是完美的解决方案。不幸的是,这被带走了。这只会将上下文注入到服务或控制器的构造函数中。在这种情况下,我仍然必须将上下文作为参数传递给服务。

有没有办法将上下文注入到服务构造函数中,并避免在创建时将其作为参数传递?

我可能会考虑更优雅的解决方案。

2 个答案:

答案 0 :(得分:2)

我的控制器只有一种方法,然后引入单独的构造函数只是为了保存ApplicationContext没有任何优势。上下文将保留在HttpContext内,您可以使用[FromServices]属性作为控制器操作的附加参数。见the documentation。例如

[Route("api/[controller]")]
public class MyController : Controller
{
    [HttpGet]
    public async IEnumerable<object> Get([FromServices] ApplicationContext context,
                                         MyType myMainParam)
    {
        ...
    }
}

RC1允许使用[FromServices]定义属性以从依赖注入中获取信息,但RC2不会允许这样做(请参阅the announcement)。您可以在the answer中找到这两种样式的示例。

答案 1 :(得分:1)

它是构造函数的依赖注入。使用DI,您不应该直接初始化您的服务。您应该在Startup.cs中注册服务 ApplicationContext

当您需要服务时,应将其通过构造函数注入控制器,DI链将自动将ApplicationContext实例注入服务。

当然,如果您不需要为控制器中的每个方法提供服务,您可以将其初始化为方法,如@Oleg所写。