在未解析构造函数的键控枚举上注册的自动类型

本文关键字:注册 类型 枚举 构造函数 | 更新日期: 2023-09-27 18:15:18

目前我们的类型有一个容器注册:

var builder = new ContainerBuilder();
builder.RegisterType<FirstClass>().Keyed<IClass>(EnumType.First);
builder.RegisterType<SecondClass>().Keyed<IClass>(EnumType.Second);
...
当我们用默认构造函数(没有构造函数)解决这个问题时,它可以完美地工作。

传递IIndex的包装器构造函数:

public SomeWrapperClass(ISomeRepo repo, IIndex<EnumType, IClass> classTypes)
    {
        _repo = repo;
        _classTypes = classTypes;
    }

,那么我们用这样的方法解析它:

private object DoSomething(EnumType enumType, SomeParameter someParameter)
    {
        var resolvedItem = _extractTypes[enumType];
        return resolvedItem .GenerateExtract(someParameter);
    }

但是,如果在IClass类型中添加带形参的构造函数,则无法找到它,我们已经尝试了几种方法来强制它,包括在构建容器时使用with形参和with constructor关键字。

我们添加的构造函数看起来像这样:
public class ClassImplementation: IClass
{
    private readonly IAnotherClassInterface _dependency;
    public ClassImplementation(IAnotherClassInterface secondClass)
    {
        _dependency = secondClass;
    }
}

我们是做错了什么,还是根本不应该这样做?

在未解析构造函数的键控枚举上注册的自动类型

这是一个Visual Studio问题,但它有一个参考问题。在重新启动re-sharper和visual studio后,我们添加了缺失的dll,并使用with构造函数关键字解析了类型,如:

builder.RegisterType<ClassImplementation>()
                .UsingConstructor(typeof (IAnotherClassInterface ))
                .Keyed<IClass>(EnumType.First);

我不是专家,也没有测试过,但作为一种黑暗的尝试,你试过吗?

builder.Register(c => new SecondClass(c.Resolve<IDependency>()).Keyed<IClass>(EnumType.Second);

假设IDependency是可解析的