【问题标题】:DI - automatically initialize IOptions<T> in constructorDI - 在构造函数中自动初始化 IOptions<T>
【发布时间】:2021-02-22 10:16:56
【问题描述】:

信息: 仍然不适用于 C# 9 计划用于 C# 10,但即使是从那个 #10 最近也被移走了...... 来源:https://github.com/dotnet/csharplang/issues/2691


原始问题正文从这里开始:

在 C# 9 中,依赖反转(通过 ctor 注入)的语法得到了简化。

发件人:

public class MyManager    
{  
    private readonly ILogger<MyManager> _logger;  
    private readonly MyService _myService;  
  
    public MyManager(ILogger<MyManager> logger, 
                     MyService myService)  
    {  
         _logger = logger;  
         _myService = myService;  
    }  
} 

收件人:

public class MyManager    
{     
    public MyManager(ILogger<MyManager> _logger, 
                     MyService _myService)  
    { }  
} 

我们如何通过这种简化也涵盖IOptions&lt;MySettings&gt; 案例?

public class MyManager    
{     
    private readonly MySettings _mySettings;

    public MyManager(ILogger<MyManager> _logger, 
                     MyService _myService,
                     IOptions<MySettings> mySettings)  
    {
        _mySettings = mySettings.Value;
    }  
} 

应用相同的简化模式并不能正常工作

public class MyManager    
{     
    // private readonly MySettings _mySettings; // remove it to simplify DI

    public MyManager(ILogger<MyManager> _logger, 
                     MyService _myService,
                     IOptions<MySettings> _mySettings)  
    { }  
} 

因为_mySettings 应该是MySettings 类型,而不是IOptions&lt;MySettings&gt; 类型。

注意:通过隐式应用相同的模式,我们可以承认_mySettings 不是MySettings 类型,而是IOptions&lt;MySettings&gt;。但是在代码中使用 _mySettings.Value.SpeficSettingField 这样的东西很奇怪。

稍后更新: (冒着违反 StackOverflow 规则的风险,将发布一个 URL 到源“神话终结者”:) C# digest -> this week's favorite -> C# Coding Guidelines & Practices

【问题讨论】:

  • 您所说的关于 C# 9 的内容不正确。也许您对记录感到困惑?
  • @YairHalberstadt - 我已经看到在 C# 摘要上发表的,在“本周最喜欢的”主题下(请原谅发布源名称......至少我不会将 URL 粘贴到源以避免违反 StackOverflow 规则)。我已经对 Microsoft 文档进行了搜索以查看任何文档,但是没有成功(可能是原始/早期):)
  • 它不存在,也不在管道中:-)。我会知道 - 我是 C# 语言设计团队的社区大使之一。我会试着找到这篇文章...
  • 我知道 typescript 支持语法,很高兴看到上面提到的文章中的信息。为了试验这一点,我快速更新了解决方案控制器中的 ctor,并且看到 VS 语法检查器没有抱怨。但是,编译仍然根本不起作用。同时,我也进行了搜索以检查如何使用 IOptions ,但是因为没有找到我向社区询问的任何内容……但是,社区中的某个人似乎出奇地沮丧:) :( 我不知道'看不出问题有什么问题。如果该功能仍然不适用,也许我们很快就会有它。

标签: constructor options c#-9.0


【解决方案1】:

真的不是答案。这个功能还为时过早:)
正如@Yair 所说:这仍然不适用于 C# 9。

我找到了文档的网址:https://github.com/dotnet/csharplang/issues/2691
据它说:计划在语言版本规划中为 10.0 候选,但不幸的是在 2021 年 2 月 6 日被删除(可能是更高版本)

现在我将把问题标记为已解决,但稍后会给出正确的答案,届时我们将与PrimaryContructors 一起玩 - 这就是我们将如何称呼它们。
感谢包容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多