3

当我尝试使用 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();
        }
4

2 回答 2

6

RegisterInstace顾名思义是用于注册实例而不是类型。

你需要的是RegisterType

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

顺便说一句,使用Autofac 扫描功能,您的注册码大致相同:

builder
    .RegisterAssemblyTypes(aCommandType.Assembly)
    .AssignableTo<IInjectedCommand>()
    .InNamespace(aCommandType.Namespace)
    .AsImplementedInterfaces()
    .InstancePerLifetimeScope();
于 2013-02-28T13:59:35.850 回答
2

就我而言,我确实想要 RegisterInstance,因为我实际上有一个想要注册的实例。我有 builder.RegisterInstance(myInstance).InstancePerDependency();

InstancePerDependency 的文档内容如下:

配置组件,以便每个依赖组件或对 Resolve() 的调用都获得一个新的、唯一的实例(默认值。)

仔细检查后,使用“每个依赖项的实例”注册实例是不可能的,因为如果实际上注册了 1 个实例,则 Autofac 不可能在每次调用 Resolve 时返回一个新实例。

所以,就我而言,解决方案是这样的。

builder.RegisterInstance(myInstance).SingleInstance();

Autofac 异常可能用更清楚的措辞来解释这个问题。

于 2018-06-16T11:38:20.340 回答