可能的GetObjectsOfType替换我有这么一小段代码.Values)icitds.DoSomething();有没有一种方法可以避免这种情况,让spring.net自动将单例注入到我声明的属性中,比如ICustomInterfaceThatDoesSomething数组?我想要这样的东西的唯一原因是因为我想杀死项目的.dll依赖项,它们是单点使用。您还可以使用方法注入:在sharedLib中:}protectedvirtualIEnumerableGetAllImplementers(){//请注意,Spring依赖项已消失//您也可以将此方法抽象化,//或者创建更有用的默认实现returnnewList();在Web应用程序中添加GetAllImplementers()的实现:返回idObjects.Values.Cast();}publicobjectImplement(objecttarget,MethodInfomethod,object[]arguments){returnGetAllImplementers();并在web应用程序的对象定义中配置方法注入:我认为使用CommonServiceLocator会更好(因为服务位置就是你正在做的),但是像这样的方法注入,你不需要额外的参考需要引入SharedLib。您的问题中有趣的部分是:如何在库中使用服务定位器函数(例如spring.net的IApplicationContext.GetObjectsOfType(...))而不引入对特定IoC容器的依赖。如问题中所述,这很有用,因为我们希望构建不强制消费者使用特定IoC容器的库。但是,我们仍然希望使用IoC容器,因为它可以简化库开发。JeremyMiller在文章“TimeforIoCContainerDetente”中很好地描述了这种困境。他的博文促成了一个名为CommonServiceLocator的小项目。该项目为服务定位指定了一个IServiceLocator接口,许多流行的IoC容器都实现了该接口,包括Spring.NET。IServiceLocator定义了IEnumerableGetAllInstances();方法,基本上是您在问题中要求的方法。当您的库需要服务定位器功能时,您可以依赖CommonServiceLocator库,您和其他消费者可以使用您选择的IoC容器连接到该库。并猜测:Spring.NET适配器实现IEnumerableGetAllInstances();使用GetObjectsOfType(服务类型);.我会在这里留下这个答案以供将来参考,但我更喜欢我的其他答案。原始答案相当长,并且非常针对问题中的示例。我认为没有等效于GetObjectsOfType(...)的配置。但是摆脱对Spring.net的依赖不是很容易吗?让我看看我是否理解正确://sharedLibcontainsICustomInterfaceThatDoesSomething//by"-->"我的意思是“依赖于”webApp-->Spring.Core,Spring.WebwebApp-->sharedLibsharedLib-->Spring。核心//仅在Spring容器上调用GetObjectsOfType(...)我们希望摆脱最后的依赖,因为我们希望能够将sharedLib与另一个DI容器一起使用。在sharedLib中,我们有一个类需要向所有ICustomInterfaceThatDoesSomething实现发出信号以执行某些操作。为此,我创建了:放;}voidSignalAllToDoSomething(){foreach(vardoerinProvider.SomethingDoers.)doerDoSomething();}}IMySomethingDoerProvider{IListGetAll();MySomethingManager过去包含Spring依赖项,但现在是SpringFree。现在,当谈到将sharedLib连接到MySomethingManager时,我有两个选择:在MySomethingManager.SomethingDoers上使用属性注入与使用IMySomethingDoerProvider的列表构造函数注入两者都可以使用Spring和许多其他DI容器来完成。如果您不介意在您的配置中列出所有ICustomInterfaceThatDoesSomething,您可以使用第一种方法。如果您需要神奇的GetObjectsOfType(...)代码,您可以使用DI容器的功能来创建IMySomethingDoerProvider。使用Spring时,第二种方法需要创建:你可以通过将它放在一个依赖sharedLib的项目中。由于您的webApp已经依赖于Spring.Core,您可以将MyProvider放在那里以便快速启动。备注如果您为每个实例调用一次DoSomething,您可以考虑指定一个初始化方法。感谢Marijin提供的洞察力!首先考虑这个通用实用程序类publicclassServiceLocatorImplementer:IMethodReplacer{privatereadonlyType_forType;publicServiceLocatorImplementer(TypeforType){this._forType=forType;}protectedIEnumerableGetAllImplementers(){varidObjects=Spring.Context.Support.ContextRegistry.GetContext().GetObjectsOfType(_forType);返回idObjects.Values;}publicobjectImplement(objecttarget,MethodInfomethod,object[]arguments){returnGetAllImplementers();GetAllICheImplentations()方法是在您实际执行GetAllICheImplentations()之前不会调用底层的GetObjectsOfType(除非您尝试在springinit期间执行它,这不会很好)如果它对您有用并且您需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
