UnityContainer和内部构造函数我有一个带有内部构造函数的类,想从Unity(2.0)解析它。publicclassMyClass{internalMyClass(IServiceservice){}}然后我在做_container.Resolve();当我这样做时,出现异常异常是:InvalidOperationException-无法构造类型MyClass。IService已注册,唯一的问题是构造函数是内部的。我真的希望这个类是公开的,但我希望它只能通过工厂创建(我实际上是在调用container.Resolve())。有没有办法让Unity看到内部构造函数?像InternalsVisibleTo之类的?为此,我深入研究了如何扩展Unity,并发现了一些有趣的信息。首先,Unity似乎通过内部解析IConstructorSelectorPolicy来选择使用哪个构造函数。Unity中包含公共抽象类ConstructorSelectorPolicyBase,它包含以下gem://////选择要为给定类型调用的构造函数。//////当前构建上下文///添加任何///生成的解析器对象。///选择的构造函数。publicSelectedConstructorSelectConstructor(IBuilderContextcontext,IPolicyListresolverPolicyDestination){TypetypeToConstruct=context.BuildKey.Type;ConstructorInfoctor=FindInjectionConstructor(typeToConstruct)??Find(ToConstructor)=null){returnCreateSelectedConstructor(context,resolverPolicyDestination,ctor);}返回空值;}FindInjectionConstructor和company是这个类中的私有静态方法,最后调用Type.GetConstructors(没有参数重载,只返回公共构造函数)。这告诉我,如果您可以安排Unity使用您自己的构造函数选择器策略,它可以选择任何构造函数,那么您就是黄金。关于如何制作和使用您自己的容器扩展有很好的文档,所以我猜您可能会创建自己的CustomConstructorSelectorPolicy,其中包括DefaultUnityConstructorSelectorPolicy的相关部分(它派生自抽象基类并且是默认类,除非您注册一些东西else)和ConstructorSelectorPolicyBase(直接从中导出可能不太好,因为key方法不是虚拟的,但您可以重用代码)。所以我认为这是可行的,但从工程的角度来看,最终结果将是非常“纯粹”的。Unity只会查看公共构造函数,因此您需要将此构造函数公开。我真的希望这个类是公共的,但我希望它只能通过工厂创建在这种情况下,创建一个工厂:publicclassMyClassFactory:IMyClassFactory{privatereadonlyIServiceservice;publicMyClassFactory(IServiceservice){this.service=service;}MyClassIMyClassFactory.CreateNew(){返回新的MyClass(this.service);}}并注册:_container.Register();并解决:_container.Resolve().CreateNew();您还可以使用Unity的InjectionFactory:container.Register(newInjectionFactory(c=>{returnnewMyClass(c.Resolve());}));为此,持有此代码的程序集应该能够看到包含MyClass的程序集的内部。换句话说,MyClass程序集应标记为InternalsVisibleTo。以及以下内容:publicstaticclassMyClassFactory{publicstaticMyClassCreateNew(IServiceservice){returnnewMyClass(service);}}container.Register(newInjectionFactory(c=>{returnMyClassFactory.Create(c.Resolve());}));虽然您不必公开构造函数,但这是混淆代码的好方法:-)只需将类设为内部类并将构造函数设为公开...接口将内部类类的构造函数公开为公开。可能有一些变通办法/黑客可以让你用Unity9I做到这一点,不知道是否有),但一般来说,如果你想让一个类由Unity(或任何IOC容器)管理,它需要使用公共构造函数公开。一种选择可能是创建一个抽象工厂,创建具有公共构造函数的类,并将类的构造函数保留在内部。缺点是您的工厂将由Unity管理,但您的类本身不会。以上就是C#学习教程分享的全部内容:UnityContainer和内部构造函数。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
