C# Unity 依赖注入,如何检索可枚举的实例?
C# Unity Dependency Injection, how can I retrieve an enumerable of instances?
我正在尝试注册相同 class 的多个实例,以便在我注入该 class 的可枚举时,我检索所有实例。
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
}
}
到目前为止我有:
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;
}
}
谁能告诉我怎么做?
只需注册依赖项名称然后解析:
...
container.RegisterInstance<IActionDialogType>("actionDialogType1", actionDialogType1, new ContainerControlledLifetimeManager());
...
container.RegisterInstance<IActionDialogType>("actionDialogType2", actionDialogType2, new ContainerControlledLifetimeManager());
var actionDialogTypeUser = container.Resolve<ActionDialogTypeUser>();
构造函数也应具有相同的类型(在您的情况下为接口):
public ActionDialogTypeUser(IEnumerable<IActionDialogType> types)
{
_types = types
}
您应该能够解决 IEnumerable
的依赖关系:
container.RegisterType<IEnumerable<IActionDialogType>, IActionDialogType[]>();
由于 Unity 理解数组,您只需将可枚举对象映射到相同类型的数组即可。这将允许您 return 实例的可枚举。
那么您可以简单地执行以下操作:
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;
}
}
}
我正在尝试注册相同 class 的多个实例,以便在我注入该 class 的可枚举时,我检索所有实例。
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
}
}
到目前为止我有:
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;
}
}
谁能告诉我怎么做?
只需注册依赖项名称然后解析:
...
container.RegisterInstance<IActionDialogType>("actionDialogType1", actionDialogType1, new ContainerControlledLifetimeManager());
...
container.RegisterInstance<IActionDialogType>("actionDialogType2", actionDialogType2, new ContainerControlledLifetimeManager());
var actionDialogTypeUser = container.Resolve<ActionDialogTypeUser>();
构造函数也应具有相同的类型(在您的情况下为接口):
public ActionDialogTypeUser(IEnumerable<IActionDialogType> types)
{
_types = types
}
您应该能够解决 IEnumerable
的依赖关系:
container.RegisterType<IEnumerable<IActionDialogType>, IActionDialogType[]>();
由于 Unity 理解数组,您只需将可枚举对象映射到相同类型的数组即可。这将允许您 return 实例的可枚举。
那么您可以简单地执行以下操作:
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;
}
}
}