gpt4 book ai didi

.net - 如何在 AutoFac 中创建可选依赖项?

转载 作者:行者123 更新时间:2023-12-03 23:46:17 25 4
gpt4 key购买 nike

我有一个接口(interface)、实现和目标:

public interface IPerson { public string Name { get; } }
public class Person: IPerson { public string Name { get { return "John"; } } }
public class Target { public Target(IPerson person) {} }

我正在使用 Autofac 将事情联系在一起:
builder.RegisterType<Person>().As<IPerson>().SingleInstance();

问题是 IPerson生活在一个共享的程序集中, Person存在于插件中(可能存在也可能不存在),并且 Target存在于加载插件的主应用程序中。如果没有加载实现 IPerson 的插件, Autofac 对无法解决 Target 大发雷霆的依赖。我真的不能为此责备它。

但是我知道 Target能够处理 IPerson 的缺失并且非常乐意获得 null反而。事实上,我很确定所有依赖 IPerson 的组件准备拍 null它取而代之。那么我该如何告诉 Autofac - “没关系,亲爱的,别担心,给我回一个 null ,好吗?”

我发现的一种方法是将默认参数添加到 Target :
public class Target { public Target(IPerson person = null) {} }

这行得通,但是我需要对所有需要 IPerson 的组件执行此操作。 .我也可以反过来做吗?不知何故告诉 Autofac“如果所有其他方法都无法解决 IPerson ,则返回 null”?

最佳答案

你可以只依赖 IPerson person = null在你的构造函数中,这是一个可选的 IPerson 的隐式声明依赖(参见@YaserMoradi)。但是,这使您现在和以后都必须巩固这一点:

"... I'm pretty sure that all the components which rely on an IPerson are prepared to take a null it its stead."



更好的是,这根本不是一个问题。

best practice ”模式(@CyrilDurand 在他的回答中作为后缀给出)是使用 default implementation (链接结果:Autofac 将使用最后注册的组件作为该服务的默认提供者)。如果您的插件没有其他实现(在默认值之后注册),则将使用此默认值。

在您的情况下,默认组件应该是 IPerson 的某种无操作或基本实现。服务,其中调用的任何方法都将具有构成应用程序默认行为的任何内容。这也提供了更好的重用故事,因为您可以一劳永逸地定义默认行为。

关于.net - 如何在 AutoFac 中创建可选依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415227/

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