gpt4 book ai didi

dependency-injection - Autofac错误: The instance registration can support SingleInstance() sharing only

转载 作者:行者123 更新时间:2023-12-01 16:13:33 32 4
gpt4 key购买 nike

当我尝试使用 autofac 注册我的类时,出现以下错误:“实例注册 'GetAllDivisionsCommand' 只能支持 SingleInstance() 共享”。

我不明白为什么会收到此错误,但假设它与具有用于缓存的静态成员变量的类有关,因为这是该类唯一不同的地方。我在将任何其他类注册为 SingleInstance 或 InstancePerDependency 时没有遇到任何问题。

本质上,该类用于从数据库中检索很少更改的部门列表,并缓存结果。每次运行该命令时,它首先检查数据库上的更改,如果检测到更改,则重新运行查询;如果没有,则返回缓存列表。

所以我尝试将 GetAllDivisionsCommand 与 Autofac 注册为 IGetAllDivisionsCommand。 IGetAllDivisionsCommand本身实现了IInjectableCommand(只是一个标记接口(interface))和ICachedListCommand。具体命令类继承自抽象基类CachedListCommand,这是静态成员变量所在的位置。

有谁知道什么会导致此错误消息? SingleInstance 对我不起作用,因为我无法继续重复使用同一个 session 。

代码:

Type commandType = typeof(IInjectedCommand);
Type aCommandType = typeof(GetAllDivisions);

var commands =
from t in aCommandType.Assembly.GetExportedTypes()
where t.Namespace == aCommandType.Namespace
&& t.IsClass
&& !t.IsAbstract
&& (commandType.IsAssignableFrom(t))
let iface = t.GetInterfaces().FirstOrDefault(x => "I" + t.Name == x.Name)
select new { Command = t, Interface = iface };

foreach (var cmd in commands)
{
builder.RegisterInstance(cmd.Command).As(cmd.Interface).InstancePerLifetimeScope();
}

最佳答案

RegisterInstace 顾名思义是 registering instances不是类型。

您需要的是RegisterType:

foreach (var cmd in commands)
{
builder.RegisterType(cmd.Command).As(cmd.Interface).InstancePerLifetimeScope();
}

顺便说一下 Autofac scanning您的注册码功能大致相同:

builder
.RegisterAssemblyTypes(aCommandType.Assembly)
.AssignableTo<IInjectedCommand>()
.InNamespace(aCommandType.Namespace)
.AsImplementedInterfaces()
.InstancePerLifetimeScope();

关于dependency-injection - Autofac错误: The instance registration can support SingleInstance() sharing only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15134163/

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