Autofac错误:实例注册只能支持SingleInstance()共享

问题描述 投票:2回答:2

当我尝试使用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();
        }
dependency-injection autofac
2个回答
5
投票

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();

1
投票

在我的情况下,我确实想要RegisterInstance,因为我实际上有一个我想要注册的实例。我有builder.RegisterInstance(myInstance).InstancePerDependency();

InstancePerDependency的文档如下:

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

仔细观察一下,使用“依赖于每个实例的实例”注册实例是不可能的,因为如果实际上已经注册了1个实例,则每次调用Resolve时Autofac都不可能返回新实例。

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

builder.RegisterInstance(myInstance).SingleInstance();

可以更清楚地说明Autofac异常来解释这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.