gpt4 book ai didi

c# - 配置 autofac 以忽略标记为过时的构造函数

转载 作者:太空狗 更新时间:2023-10-30 00:08:42 24 4
gpt4 key购买 nike

是否可以轻松配置 autofac,使其仅使用非过时的构造函数进行解析?

例如,对于具有用于非 DI 代码的辅助构造函数的类,

public class Example {

public Example(MyService service) {
// ...
}

[Obsolete]
public Example() {
service = GetFromServiceLocator<MyService>();
// ...
}
}

// ....

var builder = new ContainerBuilder();
builder.RegisterType<Example>();
// no MyService defined.
var container = builder.Build();

// this should throw an exception
var example = container.Resolve<Example>();

如果我们还没有注册 MyService,要求 autofac 解析 Example,应该会失败。

最佳答案

我不相信有一种开箱即用的方法来配置 Autofac 以忽略过时的构造函数。然而,Autofac 非常好,总有办法完成它 :) 这里有两个选项:

选项 1. 告诉 Autofac 使用哪个构造函数

使用 UsingConstructor registration extension 执行此操作方法。

builder.RegisterType<Example>().UsingConstructor(typeof(MyService));

选项 2. 为 FindConstructorsWith 提供自定义 IConstructorFinder

Autofac 有一个名为FindConstructorsWith 的注册扩展方法。您可以将自定义 IConstructorFinder 传递给两个重载之一。您可以编写一个名为 NonObsoleteConstructorFinder 的简单 IConstructorFinder,它将只返回没有 Obsolete 属性的构造函数。

我已经编写了此类并添加了您示例的工作版本。你可以view the full code并将其用作灵感。 IMO 选项,这是更优雅的选项。 我已将它添加到我的 AutofacAnswers 中GitHub 上的项目。

注意:另一个重载采用 BindingFlags。我认为您不能使用 BindingFlags 指定属性要求。但是,您可能需要检查一下。

关于c# - 配置 autofac 以忽略标记为过时的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6407530/

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