如何用Unity填充集合我有两个示例类classClassToResolve{privateList_coll;publicClassToResolve(Listcoll){_coll=coll;}}classCollectionItem{//...}我需要解析ClassToResolvevarclassToResolve=newClassToResolve(newList(){newCollectionItem(),newCollectionItem(),newCollectionItem()});现在我以某种方式解决它varclassToResolve=newClassToResolve(newList(){unity.Resolve(),unity.Resolve(),unity.Resolve()});有没有办法使用动态注册来解析Unity的ClassToResolve?Unity将理解T[](数组)依赖项是事物列表(但不是IEnumerable,也不是列表)。当您更改ClassToResolve的构造函数以采用CollectionItem[]而不是List时,您可以按如下方式配置CollectionItem类型:container.RegisterType("a");container.RegisterType("b");container.RegisterType("c");container.RegisterType("d");这里的技巧是命名所有注册。默认(未命名)注册从不属于Unity中的序列依赖项。现在您无需注册即可解析ClassToResolve:container.Resolve();如果你更喜欢注入列表,你可以添加以下注册:container.RegisterType,CollectionItem[]>();对于IEnumerable,您可以添加以下行:container.RegisterType,CollectionItem[]>();你应该统一注册你的类container.RegisterType()最好使用这个类的接口ClassToResolve:IEnumerable{privateList_coll;publicClassToResolve(IUnityContainer容器){_coll=container.ResolveAll();}publicIEnumeratorGetEnumerator(){return_coll.GetEnumerator();}IEnumeratorIEnumerable.GetEnumerator(){返回GetEnumerator();}publicvoidAdd(CollectionItem){this._coll.Add(CollectionItem);现在注册你的课程@Steven的答案是绝对正确的,我只是想建议另一种方法来解决这个问题。为了获得更好更简洁的代码,值得为所有集合项定义接口。公共接口IMyClass{voidDoSomething();}publicabstractclassMyClassBase:IMyClass{abstractvoidDoSomething();//如果需要,可以为基类添加更多代码。}publicclassMyClassA:MyClassBase{voidvirtualDoSomething(){//此处实现}}publicclassMyClassB:MyClassBase{voidvirtualDoSomething(){//此处实现}}publicclassMyClassC:MyClassBase{voidvirtualDoSomething(){//implementationhere}}//等等。现在,Unity容器的注册代码会更简单:WithName.TypeName,WithLifetime.PerResolve);container.RegisterType,IMyClass[]>();并且解析代码是相同的:varallOfMyClasses=container.ResolveAll();我希望微软在下一个版本的Unity中增加对IEnumerable的支持,这样我们就不需要注册IEnumerable了。以上就是C#学习教程:Unity填充集合的方法分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
