在未解析构造函数的键控枚举上注册的自动类型
本文关键字:注册 类型 枚举 构造函数 | 更新日期: 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
是可解析的