Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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,我试图注册同一类的多个实例,以便在注入该类的可枚举项时检索所有实例 public class ActionDialogType { public Type Type { get; set; } public string Name { get; set; } } public class ActionDialogTypeUser { private IEnumerable<ActionDialogType> _types; public Act

我试图注册同一类的多个实例,以便在注入该类的可枚举项时检索所有实例

public class ActionDialogType
{
    public Type Type { get; set; }

    public string Name { get; set; }
}



public class ActionDialogTypeUser
{
    private IEnumerable<ActionDialogType> _types;
    public ActionDialogTypeUser(IEnumerable<ActionDialogType> types)
    {
        _types = types
    }
    public void DoSomethingWithTypes()
    {
        // Do Something with types
    }
}
公共类ActionDialogType
{
公共类型类型{get;set;}
公共字符串名称{get;set;}
}
公共类ActionDialogTypeUser
{
私有IEnumerable_类型;
公共操作对话框类型用户(IEnumerable类型)
{
_类型=类型
}
公共void DoSomethingWithTypes()
{
//对类型做一些事情
}
}
到目前为止,我已经:

public class UnityConfig
{
    public IUnityContainer Register()
    {
        UnityContainer container = new UnityContainer();

        ActionDialogType actionDialogType1 = new ActionDialogType
        {
            Name = "Something",
            Type = typeof(Something)
        };
        container.RegisterInstance<IActionDialogType>(actionDialogType1, new ContainerControlledLifetimeManager());

        ActionDialogType actionDialogType2 = new ActionDialogType
        {
            Name = "SomethingElse",
            Type = typeof(SomethingElse)
        };
        container.RegisterInstance<ActionDialogType>(actionDialogType2, new ContainerControlledLifetimeManager());
        container.RegisterType<IEnumerable<ActionDialogType>, ActionDialogType[]>();

        return container;
    }
}
公共类UnityConfig
{
公共IUnityContainer寄存器()
{
UnityContainer容器=新的UnityContainer();
ActionDialogType actionDialogType1=新的ActionDialogType
{
Name=“某物”,
类型(某物)
};
RegisterInstance(actionDialogType1,new ContainerControlled LifetimeManager());
ActionDialogType actionDialogType2=新的ActionDialogType
{
Name=“SomethingElse”,
Type=typeof(SomethingElse)
};
RegisterInstance(actionDialogType2,新的ContainerControlledLifetimeManager());
container.RegisterType();
返回容器;
}
}

有人能告诉我怎么做吗?

只要用名称注册依赖项,然后解决:

...
 container.RegisterInstance<IActionDialogType>("actionDialogType1", actionDialogType1, new ContainerControlledLifetimeManager());
...
 container.RegisterInstance<IActionDialogType>("actionDialogType2", actionDialogType2, new ContainerControlledLifetimeManager());

 var actionDialogTypeUser = container.Resolve<ActionDialogTypeUser>();
。。。
RegisterInstance(“actionDialogType1”,actionDialogType1,new ContainerControlled LifetimeManager());
...
RegisterInstance(“actionDialogType2”,actionDialogType2,new ContainerControlled LifetimeManager());
var actionDialogTypeUser=container.Resolve();
此外,构造函数应具有相同的类型(在您的情况下为接口):

public ActionDialogTypeUser(IEnumerable类型)
{
_类型=类型
}

您应该能够通过以下方式解决依赖项的
IEnumerable

container.RegisterType<IEnumerable<IActionDialogType>, IActionDialogType[]>();
container.RegisterType();
因为Unity理解数组,所以只需将可枚举映射到相同类型的数组。这将允许您返回实例的可枚举项

然后您可以简单地执行以下操作:

public class ExampleController : Controller
{
     private readonly IEnumerable<IActionDialogType> actionDialogType;
     public ExampleController(IActionDialogType actionDialogType)
     {
         this.actionDialogType = actionDialogType;
     }

     public IActionResult Get()
     {
         foreach(IActionDialogType instance in actionDialogType)
         {
              // Should expose via each now.
              var name = instance.GetType().Name;
         }
     }
}
公共类示例控制器:控制器
{
私有只读IEnumerable actionDialogType;
公共示例控制器(IActionDialogType actionDialogType)
{
this.actionDialogType=actionDialogType;
}
public IActionResult Get()
{
foreach(actionDialogType中的IActionDialogType实例)
{
//现在应该通过每一个公开。
var name=instance.GetType().name;
}
}
}

似乎是一件奇怪的事情,但您是否可以将这些
ActionDialogType
s添加到一个数组中,并注册该数组的
RegisterInstance
?感谢您的响应,我想解析一个类的实例。你的答案只涉及解决问题types@chris31389我做了一个更改,如果这是asp.net核心,它将像
Container.GetAllInstances()一样简单
public class ExampleController : Controller
{
     private readonly IEnumerable<IActionDialogType> actionDialogType;
     public ExampleController(IActionDialogType actionDialogType)
     {
         this.actionDialogType = actionDialogType;
     }

     public IActionResult Get()
     {
         foreach(IActionDialogType instance in actionDialogType)
         {
              // Should expose via each now.
              var name = instance.GetType().Name;
         }
     }
}