【问题标题】:Net Core IOptions<AppSettings> useNet Core IOptions<AppSettings> 使用
【发布时间】:2019-06-12 20:15:48
【问题描述】:

我在 MVC 项目中遵循了 IOptions 模式,可以将我的 appsettings 注入到我的控制器中:

public HomeController(IOptions<AppSettings> appSettings) {
    _appSettings = appSettings.Value;
}

我有一堆从 HomeController 实例化的其他类 - 我也可以直接注入这些类,还是必须在每个类实例化时传入 _appSettings?

理想情况下,我的所有类都将注入到构造函数中,例如 Controller。

【问题讨论】:

  • 是的;您可以使用自己的类进行依赖注入。

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


【解决方案1】:

依赖注入是全有或全无的事情。如果您打算使用 DI,那么您总是使用 DI,并且几乎从不手动新建任何东西(除了基本类,如没有依赖关系的实体)。换句话说,如果你的控制器正在实例化带有依赖关系的东西,那么这些东西应该在服务集合中注册并注入到控制器中。例如,假设您正在执行以下操作:

public HomeController(IOptions<AppSettings> appSettings)
{
    _appSettings = appSettings.Value;
}

public IActionResult Foo()
{
    var service = new FooService(_appSettings);

    // do something
}

然后,您应该添加您的ConfigureServices

services.AddScoped<FooService>();

在你的控制器中,你应该这样做:

public HomeController(FooService fooService)
{
    _fooService = fooService
}

服务集合将负责将您的选项注入到服务中,因为服务本身依赖于它。

【讨论】:

  • 抱歉,如果不将 _appSettings 传递给每个类的构造函数,我看不到其他类如何获得注入的代码?
  • 服务提供者负责注入所有依赖项,一直到依赖项链。
  • 我的意思是你的类构造函数必须将必要的依赖项作为参数,当然,但你不必担心自己填写这些。
  • 如果你想在构造函数中传入其他东西会发生什么:
  • 如果可以在服务集合中注册,可以传给构造函数。没有限制,尽管具有太多依赖项的类可能会破坏单一责任原则。一个例外是像字符串这样的原始类型,因为它们不能注册为服务,但是您可以使用提供者操作重载来明确说明服务应该如何实例化,例如通过传递某种字符串。所有这些都在文档中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2021-08-22
  • 2020-04-15
相关资源
最近更新 更多