用Unity填充集合的方法

我有两个示例类

class ClassToResolve { private List _coll; public ClassToResolve(List coll) { _coll = coll; } } class CollectionItem { //... } 

我需要解决ClassToResolve

 var classToResolve = new ClassToResolve( new List() { new CollectionItem(), new CollectionItem(), new CollectionItem() } ); 

现在我以某种方式解决它

 var classToResolve = new ClassToResolve( new List() { unity.Resolve(), unity.Resolve(), unity.Resolve() } ); 

有没有办法使用动态注册解决Unity的ClassToResolve?

Unity将理解T[] (数组)依赖项是一个事物列表(但不是IEnumerable ,也不是List )。 当您更改ClassToResolve的构造ClassToResolve以获取CollectionItem[]而不是List您可以按如下方式配置CollectionItem类型:

 container.RegisterType("a"); container.RegisterType("b"); container.RegisterType("c"); container.RegisterType("d"); 

这里的诀窍是命名所有注册。 默认(无名)注册永远不会成为Unity中序列依赖的一部分。

现在您可以解析ClassToResolve而无需注册它:

 container.Resolve(); 

如果您更愿意注入List您可以添加以下注册:

 container.RegisterType, CollectionItem[]>(); 

对于IEnumerable您可以添加以下行:

 container .RegisterType, CollectionItem[]>(); 

你应该统一注册你的课程

 container.RegisterType() 

最好使用界面

用这个

 class ClassToResolve:IEnumerable { private List _coll; public ClassToResolve(IUnityContainer container) { _coll = container.ResolveAll(); } public IEnumerator GetEnumerator() { return _coll.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Add(CollectionItem) { this._coll.Add(CollectionItem); } } now register you class 

@Steven的回答是完全正确的,我只想提出另一种方法来解决这个问题。

为了更好更清洁的代码,为所有集合项定义接口是值得的。

 public interface IMyClass { void DoSomething(); } public abstract class MyClassBase : IMyClass { abstract void DoSomething(); // more code for the base class if you need it. } public class MyClassA : MyClassBase { void virtual DoSomething() { // implementation here } } public class MyClassB : MyClassBase { void virtual DoSomething() { // implementation here } } public class MyClassC : MyClassBase { void virtual DoSomething() { // implementation here } } // etc. 

现在,Unity容器的注册代码将更加容易:

 container.RegisterTypes( AllClasses.FromLoadedAssemblies(). Where(type => typeof(IMyClass).IsAssignableFrom(type)), WithMappings.FromAllInterfaces, WithName.TypeName, WithLifetime.PerResolve); container.RegisterType, IMyClass[]>(); 

并且解析代码是相同的:

 var allOfMyClasses = container.ResolveAll(); 

我希望Microsoft为下一版本的Unity添加IEnumerable<>支持,这样我们就不需要注册IEnumerable