Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用Unity将列表的依赖项作为构造函数参数注入_C#_Unity Container - Fatal编程技术网

C# 无法使用Unity将列表的依赖项作为构造函数参数注入

C# 无法使用Unity将列表的依赖项作为构造函数参数注入,c#,unity-container,C#,Unity Container,我正在使用Unity实例化我的MenuRepository实例。尝试执行此操作时,我遇到以下错误 类型列表'1具有多个长度为1的构造函数。无法消除歧义 我尝试了以下注册,但没有成功 container.RegisterType<IMenuRepository, MenuRepository>( new PerThreadLifetimeManager(), new InjectionConstructor(typeof(IMonopolyEntitiesDbCont

我正在使用Unity实例化我的MenuRepository实例。尝试执行此操作时,我遇到以下错误

类型列表'1具有多个长度为1的构造函数。无法消除歧义

我尝试了以下注册,但没有成功

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