【问题标题】:Dependency Injection in asp.net 5 custom classes, what is the correct way?asp.net 5自定义类中的依赖注入,正确的方法是什么?
【发布时间】:2015-08-25 21:16:03
【问题描述】:

试图理解 DI。

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

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

或者我应该使用 [FromServices](以前是 [Active] before beta4 )属性。

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

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

【问题讨论】:

  • 我只是在 Controller-Constructor 中添加依赖项并将它们注册到 DI 容器中。
  • 此处的第三个代码片段:blogs.msdn.com/b/webdev/archive/2014/06/17/… 显示,具体要做什么 - 请注意生命周期。
  • 谢谢你的链接。 @TGlatzer我已经注册了一些依赖项,好吧,我迷失的是,没有很好的例子,但是,说我有一个不需要服务的简单类/对象,在控制器里面,所以,第二类层次深。说我想在其中使用记录器依赖项。使用属性方法访问记录器是正确/最佳的方法吗? (或者也许我应该在 di 容器中注册所有内容?)

标签: c# dependency-injection asp.net-core asp.net5


【解决方案1】:

[FromServices] 只是一个 MVC 概念。它不适用于 ASP.NET 5 堆栈的其他部分。

如果您想将依赖项向下传递,您有几个选择:

  1. 通过服务提供商。这是一种非常反模式,因为您的对象需要依赖 DI 容器,而您并没有真正反转控件。
  2. 在构造函数中传递接口。 “纯” DI,但您最终可能会遇到参数噩梦(在构造函数中接受 10 个参数的对象)。
  3. 与上一个类似,但在工厂中对依赖项进行分组。更多的 DI 对齐和更少的参数噩梦,但它可能会造成工厂的噩梦。
  4. 仅注入顶级大型对象(例如:存储库、整个系统等)。这种方法是依赖噩梦和过多耦合之间的一个很好的权衡。当然,被注入的系统应该彼此独立。此外,每个系统内部都可以有自己的 DI 容器。

!!不要将 DI 与配置混淆。当您依赖合同时,DI 才有意义。当您需要一些特定于当前实现的信息时,配置很有用。

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

【讨论】:

  • 谢谢。很有用。我似乎仍然无法理解。对于每个级别的对象/类。除非我对所有事情都使用 DI,否则我必须手动传递依赖项,因此每个较低级别也必须包含所有下一个级别的构造函数。我希望可以做的是为我的服务使用属性来删除所有传递的构造函数。猜想它更像是服务提供者的反模式。又来了。可供我测试和阅读的想法很少。
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多