当我尝试使用autofac注册我的类时,我收到以下错误:“实例注册'GetAllDivisionsCommand'只能支持SingleInstance()共享”。
我不明白为什么我会收到这个错误,但是假设它与具有用于缓存的静态成员变量的类有关,因为这是该类唯一不同的东西。我没有遇到任何其他类注册为SingleInstance或InstancePerDependency的问题。
本质上,该类用于从数据库中检索很少更改的分区列表,并缓存结果。每次运行该命令时,它首先检查数据库上的更改,然后在检测到更改时重新运行查询;如果没有,它将返回缓存列表。
所以我试图用Autofac注册GetAllDivisionsCommand作为IGetAllDivisionsCommand。 IGetAllDivisionsCommand本身实现了IInjectableCommand,它只是一个标记接口,以及ICachedListCommand。具体的命令类继承自静态成员变量所在的抽象基类CachedListCommand。
有谁知道什么会导致此错误消息? SingleInstance对我不起作用,因为我无法继续重复使用同一个会话。
码:
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();
在我的情况下,我确实想要RegisterInstance,因为我实际上有一个我想要注册的实例。我有builder.RegisterInstance(myInstance).InstancePerDependency();
InstancePerDependency的文档如下:
配置组件,以便每个依赖组件或对Resolve()的调用都会获得一个新的唯一实例(默认值)。
仔细观察一下,使用“依赖于每个实例的实例”注册实例是不可能的,因为如果实际上已经注册了1个实例,则每次调用Resolve时Autofac都不可能返回新实例。
所以,就我而言,解决方案就是这样。
builder.RegisterInstance(myInstance).SingleInstance();
可以更清楚地说明Autofac异常来解释这个问题。