C# 无法使用Unity将列表的依赖项作为构造函数参数注入
我正在使用Unity实例化我的MenuRepository实例。尝试执行此操作时,我遇到以下错误 类型列表'1具有多个长度为1的构造函数。无法消除歧义 我尝试了以下注册,但没有成功C# 无法使用Unity将列表的依赖项作为构造函数参数注入,c#,unity-container,C#,Unity Container,我正在使用Unity实例化我的MenuRepository实例。尝试执行此操作时,我遇到以下错误 类型列表'1具有多个长度为1的构造函数。无法消除歧义 我尝试了以下注册,但没有成功 container.RegisterType<IMenuRepository, MenuRepository>( new PerThreadLifetimeManager(), new InjectionConstructor(typeof(IMonopolyEntitiesDbCont
container.RegisterType<IMenuRepository, MenuRepository>(
new PerThreadLifetimeManager(),
new InjectionConstructor(typeof(IMonopolyEntitiesDbContext),
typeof(List<MenuLink>)));
这是我的挂号
月经失调
我使用了无参数的InjectionConstructor
using (var c = new UnityContainer())
{
c.RegisterType(typeof(List<string>), new InjectionConstructor());
c.RegisterType<IMyParamClass, MyParamClass>();
c.RegisterType<IMyClass, MyClass>(
new PerThreadLifetimeManager(),
new InjectionConstructor(typeof(IMyParamClass),
typeof(List<string>)));
var obj = c.Resolve<IMyClass>();
obj.write();
}
.您需要了解,IoC容器的目标是将抽象映射到实现,并从中构建对象图。因此,为了能够创建对象,Unity需要知道如何创建对象。然而,列表并不是您典型的服务类型。它有多个构造函数,因此Unity不知道如何创建这种类型 但是,即使它确实知道如何创建它,例如通过使用List的默认构造函数,这对您来说仍然是毫无用处的,因为在这种情况下,一个空列表将被注入消费者。这几乎没有任何用处 因此,您至少应该指定要注入的内容。例如,通过这样做:
container.RegisterInstance<List<MenuLink>>(new List<MenuLink>
{
new MenuLink { Id = 1, Name = "foo" },
new MenuLink { Id = 2, Name = "bar" },
new MenuLink { Id = 3, Name = "foobar" },
});
列表有多个构造函数。Unity找不到应该使用哪个…您需要向Unity提供更多信息。但我建议您创建一个服务来创建列表,并将此服务注入到您的存储库中。正是如此,Unity需要知道您指的是Listsequence还是Listlength。列表包含什么?这是一个在应用程序期间不会更改的MenuItem对象的固定列表吗?或者这些数据是在每次请求时从数据库中重新查询的?你能详细解释一下吗?嗨,雷·阿布,我给你写了一个相当长的答案。不过我还没有发布,因为我缺少一些能够回答这个问题的基本信息。若你们能回答我之前关于列表的问题,我可以发布我的答案并帮助你们解决你们的问题。很抱歉回复晚了。List menuItem对象的状态在应用程序和单例期间不会更改,但集合可以更改。MenuItem对象将保存从数据存储调用的数据。我现在已经解决了这个问题,很快就会发布我的答案。
using (var c = new UnityContainer())
{
c.RegisterType(typeof(List<string>), new InjectionConstructor());
c.RegisterType<IMyParamClass, MyParamClass>();
c.RegisterType<IMyClass, MyClass>(
new PerThreadLifetimeManager(),
new InjectionConstructor(typeof(IMyParamClass),
typeof(List<string>)));
var obj = c.Resolve<IMyClass>();
obj.write();
}
container.RegisterInstance<List<MenuLink>>(new List<MenuLink>
{
new MenuLink { Id = 1, Name = "foo" },
new MenuLink { Id = 2, Name = "bar" },
new MenuLink { Id = 3, Name = "foobar" },
});
var menuLinks = new List<MenuLink>
{
new MenuLink { Id = 1, Name = "foo" },
new MenuLink { Id = 2, Name = "bar" },
new MenuLink { Id = 3, Name = "foobar" },
};
container.RegisterType<IMenuRepository, MenuRepository>(
new PerThreadLifetimeManager(),
new ParameterOverride("allsubMenus", menuLinks));