gpt4 book ai didi

c# - 注册工厂方法不会阻止 Autofac 调用 ctor

转载 作者:行者123 更新时间:2023-11-30 12:38:17 25 4
gpt4 key购买 nike

我有一个名为 ServiceConfiguration 的服务,它有一个非默认的 ctor。我正在尝试使用工厂方法通过 Autofac 注册它:

builder.Register(c=>LoadConfiguration())
.As<ServiceConfiguration>();

下面是简单的 LoadConfiguration 方法:

private ServiceConfiguration LoadConfiguration() {
const string fileName = "app.json";
var json = File.ReadAllText(fileName, Encoding.UTF8);
var model = JsonConvert.DeserializeObject<ServiceConfiguration>(json);
return model;
}

我希望 Autofac 在我要求解析 ServiceConfiguration 时调用 LoadConfiguration。但它似乎试图在 ServiceConfiguration 上调用 ctor。例如。调用此行:

var c = container.Resolve<ServiceConfiguration>();

导致此错误:

Autofac.Core.DependencyResolutionException: 'An error occurred duringthe activation of a particular registration. See the inner exceptionfor details. Registration: Activator = ServiceConfiguration(ReflectionActivator), Services = [ServiceConfiguration], Lifetime =Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared,Ownership = OwnedByLifetimeScope'

并且 InnerException 是:

DependencyResolutionException: None of the constructors found with'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type'ServiceConfiguration' can be invoked with the available services andparameters:Cannot resolve parameter 'JobsConfiguration jobs' of constructor 'Void .ctor(JobsConfiguration)'.

你能找出我遗漏了什么吗?

更新:我没有错过 JobsConfiguration 的注册。实际上它不是可注册的类型,我不想注册它。我根本不想调用 ctor(该服务是从 json 文件构建的),而是每当有人要求 ServiceConfiguration 我希望 Autofac 调用 LoadConfiguration() 并使用它的返回值。

更新 2:

一段时间后,似乎从 ServiceConfiguration 中提取了一个接口(interface) - 比如 IServiceConfiguration - 并且注册/解析接口(interface)工作得很好。但我想不通为什么!我的意思是:

builder.Register(c=>LoadConfiguration())
.As<IServiceConfiguration>();

var c = container.Resolve<IServiceConfiguration>();

有效。但具体版本没有。所以为什么?有什么区别?

最佳答案

您应该努力将配置文件的加载与对象组合分开。这意味着最好不要在调用Resolve 时加载配置。改变它是微不足道的:

ServiceConfiguration configuration = LoadConfiguration();
builder.RegisterInstance(configuration);

也就是说,您给定的注册应该有效:

builder.Register(c => LoadConfiguration())
.As<ServiceConfiguration>();

等同于:

builder.Register(c => LoadConfiguration());

通过此注册,Autofac 将不会自动连接 ServiceConfiguration 构造函数,但会将其留给提供的委托(delegate)。您的帖子可能没有显示某些内容。

我使用了以下 MCVE ,使用 Autofav 4.8.1,验证这是否有效:

class ServiceConfiguration
{
public ServiceConfiguration(int a, double b) => Console.WriteLine("ctor called.");
}

static ServiceConfiguration LoadConfiguration() => new ServiceConfiguration(2, 6);

static void Main(string[] args)
{
var builder = new ContainerBuilder();

builder.Register(_ => LoadConfiguration()).As<ServiceConfiguration>();

builder.Build().Resolve<ServiceConfiguration>();
}

最后一点:确保 ServiceConfiguration 不是注入(inject)到许多消费者的应用程序范围的配置类。要了解应用程序范围的配置类有什么问题,请阅读 this Q/A .

关于c# - 注册工厂方法不会阻止 Autofac 调用 ctor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54105356/

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