gpt4 book ai didi

.net - 为什么使用 ImportingConstructor 属性?

转载 作者:行者123 更新时间:2023-12-03 15:16:20 24 4
gpt4 key购买 nike

我试图了解 [ImportingConstructor]比用 [import] 装饰属性更合适.是个人喜好,还是允许由其他 DI 容器构建类的东西,或者是否有超过 [import] 的好处? ?
我认为,如果您不想公开公共(public)属性,但 MEF 也会解析私有(private)字段,那么再次,好处在哪里?

最佳答案

与其单纯从 MEF 的角度思考,不如从更广泛的意义上来看待你的类(class)设计。通常,当您设计一个类时,您有一组关联的属性,这些可能是服务,例如,

public class MyService
{
public ILogger Logger { get; set; }

public void SaySomething()
{
Logger.Log("Something");
}
}

现在,我可以继续创建一个实例:
var service = new MyService();

现在,如果我尝试使用该方法:
service.SaySomething();

如果我不明确知道我还必须初始化我的 Logger属性(property):
var service = new MyService() { Logger = new ConsoleLogger() };

(或者):
var service = new MyService();
service.Logger = new ConsoleLogger();

然后错误直到运行时才会变得明显。如果我们要重新定义类:
public class MyService
{
private readonly ILogger _logger;

public MyService(ILogger logger)
{
if (logger == null) throw new ArgumentNullException("logger");

_logger = logger;
}

public void SaySomething()
{
_logger.Log("Something");
}
}

现在,如果您尝试创建 MyService 的实例,您必须明确提供此附加服务( ILogger )才能正确初始化对象。这有助于多种方式:
  • 您表达了您的类型所需的依赖关系,这形成了一个初始化契约,必须满足该契约以确保在可用状态下创建类型。
  • 通过确保将服务传递给您的类型来降低运行时错误的风险。

  • 您可以通过使用代码契约(Contract)(如@JaredPar 所述)在编译时进行静态检查来进一步改进此设计。

    就 MEF 而言,您可以使用 [Import]而不是 [ImportingConstructor]因为 MEF 在不能满足类型的所有导入时会抛出异常,并且只会在初始化( [ImportingConstructor] )和 [Import] 之后返回类型s。

    构造函数注入(inject)通常是可取的。

    关于.net - 为什么使用 ImportingConstructor 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840568/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com