- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为什么不显式使用 IServiceProvider 来解决依赖关系,而不是单独注入(inject)每个依赖关系。换句话说,为什么要使用这种方法:
public class A
{
private B _b;
private C _c;
private D _d;
private E _e;
public A(B b, C c, D d, E e)
{
_b = b;
_c = c;
_d = d;
_e = e;
}
}
不是这个:
public class A
{
private B _b;
private C _c;
private D _d;
private E _e;
public A(IServiceProvider sp)
{
_b = (b) sp.GetService(typeof(b));
_c = (c) sp.GetService(typeof(c));
_d = (d) sp.GetService(typeof(d));
_e = (e) sp.GetService(typeof(e));
}
}
请注意,我可能不会为所有 类型调用GetService
,某些类型可能实际上是可选的(即有时使用,有时不使用) .
第二种方法的优点是,如果 A 的依赖关系发生变化,我们不需要在调用 A 的构造函数的每个地方都进行更改,并且我们不需要无论我们在哪里调用构造函数,所有依赖项都已经可用。
MS 似乎在以下文章中反对这样做:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2#recommendations他们提到要避免使用服务定位器模式而不是 DI,但我们这里不是仍在使用 DI 吗?无论如何,同样的事情不会在后台发生吗?
最佳答案
有几个原因。当您使用依赖项注入(inject)时,您就是在赋予 DI 容器为您准备依赖项的责任。这些类不应该关心您的依赖项是如何创建的。如果切换到不同的 DI 库,则必须更改所有类中的构造函数。
另一个小问题是您必须在每个单元测试中为您的服务容器创建一个模拟,这不是一个大问题,但绝对是一件令人讨厌的事情。
最后,当您必须将依赖项传递给嵌套类时,您的代码将变得非常奇怪,更不用说您想要继承的任何时候了。
关于c# - 为什么不注入(inject) IServiceProvider 而不是每个单独的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57674730/
我很难理解为什么在使用 IApplicationBuilder.ApplicationServices 时,在启动配置方法中应用服务定位器模式的行为会有所不同。而不是IServiceProvider
我正在使用 .Net Core,目前我正在使用它的 DI 引擎。 我的项目是一个类库,因此,asp的绑定(bind)在这里无关紧要。 我遵循了 this article 中的提示为了使 DI 工作。
TLDR:是否可以在 Startup 运行后修改 IServiceProvider? 我在运行时运行 dll(它实现了我的接口(interface))。因此有一个文件监听器后台作业,它会等到 plug
我是在探索 XNA 框架时提出这个问题的,但我希望有一个大致的了解。 ISomeService someService = (ISomeService)Game.GetServices(typeof(
IServiceProvider 基本上只是任何 IOC 容器的通用接口(interface),还是用于特定框架?我正在滚动我自己的轻量级 IOC 容器,我想知道我是否应该实现它。还有其他我应该实现的
我试图调试应用程序中的内存泄漏(请参阅相关的 question ),并且遇到了错误的行为。 在此代码中(当然是简化的代码片段): while (true) { usin
我正在尝试为 IServiceProvider 创建一个 Mock(使用 Moq),以便我可以测试我的存储库类: public class ApiResourceRepository : IApiRe
我正在使用 IHostBuilder在 .NET Core 2.1 控制台应用程序中。主要看起来像这样: public static async Task Main(string[] args
我正在编写一些设计时代码。我想使用这个片段:(找到 here) var dte = (EnvDTE.DTE) GetService(typeof(EnvDTE.DTE)); if (dte != nu
我想知道为什么不显式使用 IServiceProvider 来解决依赖关系,而不是单独注入(inject)每个依赖关系。换句话说,为什么要使用这种方法: public class A { pr
我需要在开源MFC应用程序中实现IServiceProvider接口(interface);特别是我的 TTSApp申请。 我正在尝试添加对 IAccessibleApplication interf
这是关于 .NET 的一般性问题 我得到了一个 IServiceProvider 的实例接口(interface),但我几乎没有关于从中可以得到什么的文档。我如何找到它可能提供的所有服务的列表? 最佳
我在查看我的一些旧代码时发现了一个混合的 IValueConverter/MarkupExtension 类。这让我想知道 ProvideValue 方法中的 IServiceProvider 是否真
我希望能够访问内置的 IoC 容器(IServiceProvider 我相信)。 我知道在代码中访问它通常是不好的做法,我们应该允许框架将所需的任何依赖项注入(inject)到 Controller
我需要使用 IServiceProvider 在 ASP.NET Core 1.0 的 ConfigureService 方法中访问 session 变量。 我有一个使用委托(delegate)/la
我正在研究 xamarin 表单上的“依赖注入(inject)”,并发现了一些使用类似 ContainerBuilder 的概念。 .网上找到的解决方案如this ,讨论如何进行 DI 设置并将它们注
我们可以访问 IServiceProvider作为: public class ProductService { private readonly IProductRepository _pr
我们可以访问 IServiceProvider作为: public class ProductService { private readonly IProductRepository _pr
如果您编写自己的 MarkupExtension,您可能会偶然发现 IServiceProvider serviceProvider 参数在设计时与运行时不同。例如,您无法获取 IRootObject
我正在实现一个新的 .NET Core 项目并为我的服务层进行依赖注入(inject)。我创建了一个实现 IServiceProvider 的接口(interface),现在必须实现 GetServi
我是一名优秀的程序员,十分优秀!