用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
。