在 ASP.NET 5 自定义类中使用依赖注入,应该采用什么正确的方式?

4

尝试理解依赖注入(DI)。

在自定义类中使用服务/依赖对象的正确方式是什么?

我需要将每个类都创建为服务并添加到依赖对象中吗?

还是应该使用[FromServices](以前是beta4之前的[Active])属性。

或者,是否有一个服务对象我应该传递来访问它们?

我想要理解的是如何正确编写自己的类来使用DI,就像控制器等一样。


1
我会在控制器构造函数中添加依赖项,并将它们注册到 DI 容器中。 - TGlatzer
1
第三个CodeSnippet在这里:http://blogs.msdn.com/b/webdev/archive/2014/06/17/dependency-injection-in-asp-net-vnext.aspx,展示了具体的操作步骤 - 请注意生命周期。 - TGlatzer
谢谢,提供链接。@TGlatzer 我已经成功注册了一些依赖项,但我迷失在没有好的示例上,假设我有一个简单的类/对象,不需要成为服务,它在控制器内部,所以是第二级深度。假设我想在其中使用记录器依赖项。使用属性方法来访问记录器是正确/最佳的方式吗?(或者也许我应该在 DI 容器中注册所有内容?) - TheBreadman
1个回答

4

[FromServices]是一个MVC的概念,其他ASP.NET 5堆栈的部分没有这个概念。

如果你想向下传递依赖项,有几种选择:

  1. 传递服务提供程序。这是一种反模式,因为您的对象需要依赖于DI容器,并且您并没有真正地反转控制。
  2. 在构造函数中传递接口。这是“纯”DI,但您可能会遇到参数困境(构造函数需要10个参数的对象)。
  3. 与前面的方法类似,但使用工厂将依赖项进行分组。更符合DI的思想,而且不会出现参数困境,但可能会创建工厂难题。
  4. 仅注入顶层大型对象(例如:存储库、整个系统等)。这种方法在依赖关系困境和过度耦合之间取得了不错的平衡。当然,被注入的系统应该彼此独立。此外,每个系统内部都可以有自己的DI容器。

!! 不要将DI与配置混淆。当您需要依赖于协议时,DI很有用。当您需要特定于当前实现的某些信息时,配置很有用。

例如:如果您有一个IRepository,则不应该注入连接字符串,因为连接字符串是特定于您连接的系统的内容。有些情况下,连接字符串并没有意义。例如,InMemoryRepository不需要连接字符串,因此这不是所有实现的常见依赖项。


谢谢。非常有用。我仍然似乎不能理解每个对象/类级别。除非我对所有东西使用DI,否则我必须手动传递依赖项,因此每个较低级别也必须包含所有下一个的构造函数。我希望可以使用属性来为我的服务完成所有构造函数传递。猜想它更像是服务提供者这样的反模式。再次感谢。还有一些我要测试和阅读的想法。 - TheBreadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接