ABP 源码解析 二. IOC初始化
介绍此系列文章主要是对ABP源码进行解读,初探作者在创造ABP的框架思路,和使用到的设计模式进行。通过解读ABP源码,可以提升ABP使用方式,可以提升编码意识,提高面向对象编程思想。在《ABP源码解析一.ABP启动》中介绍了ABP是如何启动的。此篇文章主要解读ABP框架中IOC相关内容介绍。ABP中的Ioc容器依赖CastleWindsor。在ABP启动中,可以看到是如何使用IOC的,在AbpBootstrapper构造函数中,有如下代码//设置Ioc管理器IocManager=options.IocManager;由此可知,ABP容器是通过options传递到启动类中的,通过阅读AbpBootstrapperOptions类publicAbpBootstrapperOptions(){IocManager=Abp.Dependency.IocManager.Instance;PlugInSources=newPlugInSourceList();}得知选项中的IocManager是Abp.Dependency.IocManager.Instance所得。接下来我们主要依据IocManager.Instance进行代码分析。类文件结构图IocManagerIIocManagerIIocRegistrarIIocResolverIConventionalRegistrationContextIConventionalDependencyRegistrarConventionalRegistrationConfigDependencyLifeStyle源码解析主要接口abp和ioc有关的接口主要有三个IIocRegistrar:用于注册依赖项的类的接口IIocResolver:用于解析依赖的类的接口IIocManager:用于注册和解析依赖项的接口1.IIocRegistrarIIocRegistrar主要提供了各种注册依赖项的方法,以及提供是否已注册的检测方法主要有:普通注册:AddConventionalRegistrar程序集注册:RegisterAssemblyByConvention类型注册:Register检查是否已注册:IsRegistered///<summary>///Defineinterfacefor>///定义用于注册依赖项的类的接口///</summary>publicinterfaceIIocRegistrar{///<summary>///Addsadependencyregistrarforconventionalregistration.///添加依赖注册器///</summary>///<paramname="registrar">dependencyregistrar</param>voidAddConventionalRegistrar(IConventionalDependencyRegistrarregistrar);///<summary>///Registerstypesofgivenassemblybyallconventionalregistrars.See<seecref="IocManager.AddConventionalRegistrar"/>method.///注册指定的信息集///</summary>///<paramname="assembly">Assemblytoregister</param>voidRegisterAssemblyByConvention(Assemblyassembly);///<summary>///Registerstypesofgivenassemblybyallconventionalregistrars.See<seecref="IocManager.AddConventionalRegistrar"/>method.///注册指定的信息集///</summary>///<paramname="assembly">Assemblytoregister///指定的信息集///</param>///<paramname="config">Additionalconfiguration///配置///</param>voidRegisterAssemblyByConvention(Assemblyassembly,ConventionalRegistrationConfigconfig);///<summary>///Registersatypeasselfregistration.///注册自身类型///</summary>///<typeparamname="T">Typeofthe>///类的类型///</typeparam>///<paramname="lifeStyle">Life>DependencyLifeStyle.Singleton)whereT:>;///<summary>///Registersatypeasselfregistration.///注册自身类型///</summary>///<paramname="type">Typeofthe>///类的类型///</param>///<paramname="lifeStyle">Life>DependencyLifeStyle.Singleton);///<summary>///Registersatypewithit'simplementation.///注册一个类型的实现///</summary>///<typeparamname="TType">Registeringtype///注册类型///</typeparam>///<typeparamname="TImpl">Thetypethatimplements<seecref="TType"/>///实现类型///</typeparam>///<paramname="lifeStyle">Life>DependencyLifeStyle.Singleton)whereTType:>whereTImpl:>,TType;///<summary>///Registersatypewithit'simplementation.///注册一个类型的实现///</summary>///<paramname="type">Typeofthe>///注册类型///</param>///<paramname="impl">Thetypethatimplements///实现类型///<paramrefname="type"/></param>///<paramname="lifeStyle">Life>DependencyLifeStyle.Singleton);///<summary>///Checkswhethergiventypeisregisteredbefore.///检查指定类型是否已注册///</summary>///<paramname="type">Typetocheck///指定类型///</param>boolIsRegistered(Typetype);///<summary>///Checkswhethergiventypeisregisteredbefore.///检查指定类型是否已注册///</summary>///<typeparamname="TType">Typetocheck///指定类型///</typeparam>boolIsRegistered<TType>();}2.IIocResolverIIocResolver接口主要提供了如何从ioc容器中解析组件的方法,主要有解析单个组件:Resolve解析全部组件:ResolveAll检查组件是否已注册:IsRegistered///<summary>///Defineinterfacefor>///定义用于解析依赖的类的接口///</summary>publicinterfaceIIocResolver{///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取一个对象///</summary>///<typeparamname="T">Typeoftheobjecttoget///获取类型///</typeparam>///<returns>Theobjectinstance///对象实例///</returns>TResolve<T>();///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取一个对象///</summary>///<typeparamname="T">Typeoftheobjecttocast///对象转到的类型///</typeparam>///<paramname="type">Typeoftheobjecttoresolve///解析的对象类型///</param>///<returns>Theobjectinstance///对象实例///</returns>TResolve<T>(Typetype);///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取一个对象///</summary>///<typeparamname="T">Typeoftheobjecttoget///获取的对象类型///</typeparam>///<paramname="argumentsAsAnonymousType">Constructorarguments///构造函数参数///</param>///<returns>Theobjectinstance///对象实例///</returns>TResolve<T>(objectargumentsAsAnonymousType);///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取一个对象///</summary>///<paramname="type">Typeoftheobjecttoget///获取对象的类型///</param>///<returns>Theobjectinstance///对象实例///</returns>objectResolve(Typetype);///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取一个对象///</summary>///<paramname="type">Typeoftheobjecttoget///获取对象的类型///</param>///<paramname="argumentsAsAnonymousType">Constructorarguments///构造函数参数///</param>///<returns>Theobjectinstance///对象实例///</returns>objectResolve(Typetype,objectargumentsAsAnonymousType);///<summary>///Getsallimplementationsforgiventype.///ReturningobjectsmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取全部对象///</summary>///<typeparamname="T">Typeoftheobjectstoresolve///解析对象的类型///</typeparam>///<returns>Objectinstances///全部对象实例///</returns>T[]ResolveAll<T>();///<summary>///Getsallimplementationsforgiventype.///ReturningobjectsmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取全部对象///</summary>///<typeparamname="T">Typeoftheobjectstoresolve///解析对象的类型///</typeparam>///<paramname="argumentsAsAnonymousType">Constructorarguments///构造函数参数///</param>///<returns>Objectinstances///全部对象实例///</returns>T[]ResolveAll<T>(objectargumentsAsAnonymousType);///<summary>///Getsallimplementationsforgiventype.///ReturningobjectsmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取指定类型的全部对象///</summary>///<paramname="type">Typeoftheobjectstoresolve///解析对象的类型///</param>///<returns>Objectinstances///全部对象实例///</returns>object[]ResolveAll(Typetype);///<summary>///Getsallimplementationsforgiventype.///ReturningobjectsmustbeReleased(see<seecref="Release"/>)afterusage.///从IOC容器中获取指定类型的全部对象///</summary>///<paramname="type">Typeoftheobjectstoresolve///解析对象的类型///</param>///<paramname="argumentsAsAnonymousType">Constructorarguments///构造函数参数///</param>///<returns>Objectinstances///全部对象实例///</returns>object[]ResolveAll(Typetype,objectargumentsAsAnonymousType);///<summary>///Releasesapre-resolvedobject.SeeResolvemethods.///释放解析对象///</summary>///<paramname="obj">Objecttobereleased///被释放的对象///</param>voidRelease(objectobj);///<summary>///Checkswhethergiventypeisregisteredbefore.///检查给定类型是否已注册///</summary>///<paramname="type">Typetocheck///指定类型///</param>boolIsRegistered(Typetype);///<summary>///Checkswhethergiventypeisregisteredbefore.///检查给定类型是否已注册///</summary>///<typeparamname="T">Typetocheck///指定类型///</typeparam>boolIsRegistered<T>();}3.IIocManagerIIocManager继承自:IIocRegistrar,IIocResolver,提供Ioc容器访问属性///<summary>///Thisinterfaceisusedtodirectlyperformdependencyinjectiontasks.///用于注册和解析依赖项的接口///</summary>publicinterfaceIIocManager:IIocRegistrar,IIocResolver,IDisposable{///<summary>///ReferencetotheCastleWindsorContainer.///Ioc容器///</summary>IWindsorContainerIocContainer{get;}///<summary>///Checkswhethergiventypeisregisteredbefore.///检查指定类型是否已经注入///</summary>///<paramname="type">Typetocheck///检查的类型///</param>newboolIsRegistered(Typetype);///<summary>///Checkswhethergiventypeisregisteredbefore.///检查指定类型是否已经注入///</summary>///<typeparamname="T">Typetocheck///检查的类型///</typeparam>newboolIsRegistered<T>();}IocManager实现IocManager是主要实现类,在此类中,初始化Windsor容器,编译能够将类型注入到ioc容器中和从ioc容器中解析组件。///<summary>///This>///负责依赖注入///</summary>public>IocManager:IIocManager{///<summary>///TheSingletoninstance.///IocManager单例///</summary>publicstaticIocManagerInstance{get;privateset;}///<summary>///ReferencetotheCastleWindsorContainer.///CastleWindsor容器///</summary>publicIWindsorContainerIocContainer{get;privateset;}///<summary>///Listofallregisteredconventionalregistrars.///</summary>privatereadonlyList<IConventionalDependencyRegistrar>_conventionalRegistrars;staticIocManager(){Instance=newIocManager();}///<summary>///Createsanew<seecref="IocManager"/>object.///Normally,youdon'tdirectlyinstantiatean<seecref="IocManager"/>.///Thismaybeusefulfortestpurposes.///</summary>publicIocManager(){IocContainer=newWindsorContainer();_conventionalRegistrars=newList<IConventionalDependencyRegistrar>();//Registerself!IocContainer.Register(Component.For<IocManager,IIocManager,IIocRegistrar,IIocResolver>().UsingFactoryMethod(()=>this));}///<summary>///Addsadependencyregistrarforconventionalregistration.///</summary>///<paramname="registrar">dependencyregistrar</param>publicvoidAddConventionalRegistrar(IConventionalDependencyRegistrarregistrar){_conventionalRegistrars.Add(registrar);}///<summary>///Registerstypesofgivenassemblybyallconventionalregistrars.See<seecref="AddConventionalRegistrar"/>method.///</summary>///<paramname="assembly">Assemblytoregister</param>publicvoidRegisterAssemblyByConvention(Assemblyassembly){RegisterAssemblyByConvention(assembly,newConventionalRegistrationConfig());}///<summary>///Registerstypesofgivenassemblybyallconventionalregistrars.See<seecref="AddConventionalRegistrar"/>method.///</summary>///<paramname="assembly">Assemblytoregister</param>///<paramname="config">Additionalconfiguration</param>publicvoidRegisterAssemblyByConvention(Assemblyassembly,ConventionalRegistrationConfigconfig){varcontext=newConventionalRegistrationContext(assembly,this,config);foreach(varregistererin_conventionalRegistrars){registerer.RegisterAssembly(context);}if(config.InstallInstallers){IocContainer.Install(FromAssembly.Instance(assembly));}}///<summary>///Registersatypeasselfregistration.///</summary>///<typeparamname="TType">Typeofthe>Life>{IocContainer.Register(ApplyLife>Typeofthe>Life>{IocContainer.Register(ApplyLife>Registeringtype</typeparam>///<typeparamname="TImpl">Thetypethatimplements<seecref="TType"/></typeparam>///<paramname="lifeStyle">Life>{IocContainer.Register(ApplyLife>Typeofthe>Thetypethatimplements<paramrefname="type"/></param>///<paramname="lifeStyle">Life>{IocContainer.Register(ApplyLife>Typetocheck</param>publicboolIsRegistered(Typetype){returnIocContainer.Kernel.HasComponent(type);}///<summary>///Checkswhethergiventypeisregisteredbefore.///</summary>///<typeparamname="TType">Typetocheck</typeparam>publicboolIsRegistered<TType>(){returnIocContainer.Kernel.HasComponent(typeof(TType));}///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="IIocResolver.Release"/>)afterusage.///</summary>///<typeparamname="T">Typeoftheobjecttoget</typeparam>///<returns>Theinstanceobject</returns>publicTResolve<T>(){returnIocContainer.Resolve<T>();}///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="Release"/>)afterusage.///</summary>///<typeparamname="T">Typeoftheobjecttocast</typeparam>///<paramname="type">Typeoftheobjecttoresolve</param>///<returns>Theobjectinstance</returns>publicTResolve<T>(Typetype){return(T)IocContainer.Resolve(type);}///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="IIocResolver.Release"/>)afterusage.///</summary>///<typeparamname="T">Typeoftheobjecttoget</typeparam>///<paramname="argumentsAsAnonymousType">Constructorarguments</param>///<returns>Theinstanceobject</returns>publicTResolve<T>(objectargumentsAsAnonymousType){returnIocContainer.Resolve<T>(argumentsAsAnonymousType);}///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="IIocResolver.Release"/>)afterusage.///</summary>///<paramname="type">Typeoftheobjecttoget</param>///<returns>Theinstanceobject</returns>publicobjectResolve(Typetype){returnIocContainer.Resolve(type);}///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="IIocResolver.Release"/>)afterusage.///</summary>///<paramname="type">Typeoftheobjecttoget</param>///<paramname="argumentsAsAnonymousType">Constructorarguments</param>///<returns>Theinstanceobject</returns>publicobjectResolve(Typetype,objectargumentsAsAnonymousType){returnIocContainer.Resolve(type,argumentsAsAnonymousType);}///<inheritdoc/>publicT[]ResolveAll<T>(){returnIocContainer.ResolveAll<T>();}///<inheritdoc/>publicT[]ResolveAll<T>(objectargumentsAsAnonymousType){returnIocContainer.ResolveAll<T>(argumentsAsAnonymousType);}///<inheritdoc/>publicobject[]ResolveAll(Typetype){returnIocContainer.ResolveAll(type).Cast<object>().ToArray();}///<inheritdoc/>publicobject[]ResolveAll(Typetype,objectargumentsAsAnonymousType){returnIocContainer.ResolveAll(type,argumentsAsAnonymousType).Cast<object>().ToArray();}///<summary>///Releasesapre-resolvedobject.SeeResolvemethods.///</summary>///<paramname="obj">Objecttobereleased</param>publicvoidRelease(objectobj){IocContainer.Release(obj);}///<inheritdoc/>publicvoidDispose(){IocContainer.Dispose();}privatestaticComponentRegistration<T>ApplyLife>1.初始化容器在IocManager构造函数,初始化了WindsorContainer容器,并且将自身实例,注入到容器中,以便能解析IocManager,IIocManager,IIocRegistrar,IIocResolver组件publicIocManager(){IocContainer=newWindsorContainer();_conventionalRegistrars=newList<IConventionalDependencyRegistrar>();//Registerself!IocContainer.Register(Component.For<IocManager,IIocManager,IIocRegistrar,IIocResolver>().UsingFactoryMethod(()=>this));}2.注册组件由于已经初始化了WindsorContainer容器,abp抽象了集中常用的注册方式,直接注入到容器中publicvoidRegisterAssemblyByConvention(Assemblyassembly,ConventionalRegistrationConfigconfig){varcontext=newConventionalRegistrationContext(assembly,this,config);foreach(varregistererin_conventionalRegistrars){registerer.RegisterAssembly(context);}if(config.InstallInstallers){IocContainer.Install(FromAssembly.Instance(assembly));}}publicvoidRegister<TType>(DependencyLifeStylelifeStyle=DependencyLifeStyle.Singleton)whereTType:>{IocContainer.Register(ApplyLife>3.解析组件抽象方法,从WindsorContainer中解析///<summary>///GetsanobjectfromIOCcontainer.///ReturningobjectmustbeReleased(see<seecref="IIocResolver.Release"/>)afterusage.///</summary>///<typeparamname="T">Typeoftheobjecttoget</typeparam>///<returns>Theinstanceobject</returns>publicTResolve<T>(){returnIocContainer.Resolve<T>();}///<inheritdoc/>publicT[]ResolveAll<T>(){returnIocContainer.ResolveAll<T>();}4.检查是否已注册检测组件是否已在WindsorContainer中注册///<summary>///Checkswhethergiventypeisregisteredbefore.///</summary>///<paramname="type">Typetocheck</param>publicboolIsRegistered(Typetype){returnIocContainer.Kernel.HasComponent(type);}///<summary>///Checkswhethergiventypeisregisteredbefore.///</summary>///<typeparamname="TType">Typetocheck</typeparam>publicboolIsRegistered<TType>(){returnIocContainer.Kernel.HasComponent(typeof(TType));}设计模式1.单例模式IocManager提供的单例模式,严格意义上,IocManager类还不算是单例,因为其构造方法是public,也就意味着,可以直接创建IocManager实例。///<summary>///TheSingletoninstance.///IocManager单例///</summary>publicstaticIocManagerInstance{get;privateset;}staticIocManager(){Instance=newIocManager();}publicIocManager(){}2.代理模式IocManager也使用到了代理模式,抽象封装自己的接口信息,代理IWindsorContainer,丰富框架内的接口。测试代码和ioc容器有关的测试,如下图ioc测试public>IocManager_LifeStyle_Tests:TestBaseWithLocalIocManager{///<summary>///当组件释放时需要调用Dispose///</summary>[Fact]publicvoidShould_Call_Dispose_Of_Transient_Dependency_When_Object_Is_Released(){LocalIocManager.IocContainer.Register(Component.For<SimpleDisposableObject>().Life>LocalIocManager.IocContainer.Resolve<SimpleDisposableObject>();LocalIocManager.IocContainer.Release(obj);obj.DisposeCount.ShouldBe(1);}///<summary>///当iocManager释放之后,对象也被释放///</summary>[Fact]publicvoidShould_Call_Dispose_Of_Transient_Dependency_When_IocManager_Is_Disposed(){LocalIocManager.IocContainer.Register(Component.For<SimpleDisposableObject>().Life>LocalIocManager.IocContainer.Resolve<SimpleDisposableObject>();LocalIocManager.Dispose();obj.DisposeCount.ShouldBe(1);}///<summary>///当iocManager释放之后,单例对象也被释放///</summary>[Fact]publicvoidShould_Call_Dispose_Of_Singleton_Dependency_When_IocManager_Is_Disposed(){LocalIocManager.IocContainer.Register(Component.For<SimpleDisposableObject>().Life>LocalIocManager.IocContainer.Resolve<SimpleDisposableObject>();LocalIocManager.Dispose();obj.DisposeCount.ShouldBe(1);}}public>ScopedIocResolver_Tests:TestBaseWithLocalIocManager{///<summary>///scope需要正常运行///</summary>[Fact]publicvoidUsingScope_Test_ShouldWork(){LocalIocManager.Register<SimpleDisposableObject>(DependencyLifeStyle.Transient);SimpleDisposableObjectsimpleObj=null;LocalIocManager.UsingScope(scope=>{simpleObj=scope.Resolve<SimpleDisposableObject>();});simpleObj.DisposeCount.ShouldBe(1);}///<summary>///带有构造函数的scope能够正常运行///</summary>[Fact]publicvoidUsingScope_Test_With_Constructor_ShouldWork(){LocalIocManager.Register<SimpleDisposableObject>(DependencyLifeStyle.Transient);SimpleDisposableObjectsimpleObj=null;LocalIocManager.UsingScope(scope=>{simpleObj=scope.Resolve<SimpleDisposableObject>(new{myData=40});});simpleObj.MyData.ShouldBe(40);}///<summary>///IIocScopedResolver接口正常///</summary>[Fact]publicvoidIIocScopedResolver_Test_ShouldWork(){LocalIocManager.Register<SimpleDisposableObject>(DependencyLifeStyle.Transient);LocalIocManager.Register<SimpleDisposableObject2>(DependencyLifeStyle.Transient);LocalIocManager.Register<SimpleDisposableObject3>(DependencyLifeStyle.Transient);SimpleDisposableObjectsimpleObj;SimpleDisposableObject2simpleObj2;SimpleDisposableObject3simpleObj3;using(varscope=LocalIocManager.CreateScope()){simpleObj=scope.Resolve<SimpleDisposableObject>();simpleObj2=scope.Resolve<SimpleDisposableObject2>();simpleObj3=scope.Resolve<SimpleDisposableObject3>();}simpleObj.DisposeCount.ShouldBe(1);simpleObj2.DisposeCount.ShouldBe(1);simpleObj3.DisposeCount.ShouldBe(1);}///<summary>///IIocScopedResolver接口正常,解析组件有构造函数///</summary>[Fact]publicvoidIIocScopedResolver_Test_With_ConstructorArgs_ShouldWork(){LocalIocManager.Register<SimpleDisposableObject>(DependencyLifeStyle.Transient);LocalIocManager.Register<SimpleDisposableObject2>(DependencyLifeStyle.Transient);LocalIocManager.Register<SimpleDisposableObject3>(DependencyLifeStyle.Transient);SimpleDisposableObjectsimpleObj;SimpleDisposableObject2simpleObj2;SimpleDisposableObject3simpleObj3;using(varscope=LocalIocManager.CreateScope()){simpleObj=scope.Resolve<SimpleDisposableObject>(new{myData=40});simpleObj2=scope.Resolve<SimpleDisposableObject2>(new{myData=4040});simpleObj3=scope.Resolve<SimpleDisposableObject3>(new{myData=404040});}simpleObj.MyData.ShouldBe(40);simpleObj2.MyData.ShouldBe(4040);simpleObj3.MyData.ShouldBe(404040);}[Fact]publicvoidIIocScopedResolver_Test_ResolveAll_Should_DisposeAll_Registrants(){LocalIocManager.Register<ISimpleDependency,SimpleDependency>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency2>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency3>(DependencyLifeStyle.Transient);IEnumerable<ISimpleDependency>simpleDependendcies;using(varscope=LocalIocManager.CreateScope()){simpleDependendcies=scope.ResolveAll<ISimpleDependency>();}simpleDependendcies.ShouldAllBe(d=>d.DisposeCount==1);}[Fact]publicvoidIIocScopedResolver_Test_ResolveAll_Should_Work_WithConstructor(){LocalIocManager.Register<ISimpleDependency,SimpleDependency>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency2>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency3>(DependencyLifeStyle.Transient);IEnumerable<ISimpleDependency>simpleDependendcies;using(varscope=LocalIocManager.CreateScope()){simpleDependendcies=scope.ResolveAll<ISimpleDependency>(new{myData=40});}simpleDependendcies.ShouldAllBe(x=>x.MyData==40);}[Fact]publicvoidIIocScopedResolver_Test_ResolveAll_Should_Work_With_OtherResolvings(){LocalIocManager.Register<ISimpleDependency,SimpleDependency>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency2>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency3>(DependencyLifeStyle.Transient);LocalIocManager.Register<SimpleDisposableObject>(DependencyLifeStyle.Transient);IEnumerable<ISimpleDependency>simpleDependendcies;SimpleDisposableObjectsimpleObject;using(varscope=LocalIocManager.CreateScope()){simpleDependendcies=scope.ResolveAll<ISimpleDependency>();simpleObject=scope.Resolve<SimpleDisposableObject>();}simpleDependendcies.ShouldAllBe(x=>x.DisposeCount==1);simpleObject.DisposeCount.ShouldBe(1);}[Fact]publicvoidIIocScopedResolver_Test_ResolveAll_Should_Work_With_OtherResolvings_ConstructorArguments(){LocalIocManager.Register<ISimpleDependency,SimpleDependency>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency2>(DependencyLifeStyle.Transient);LocalIocManager.Register<ISimpleDependency,SimpleDependency3>(DependencyLifeStyle.Transient);LocalIocManager.Register<SimpleDisposableObject>(DependencyLifeStyle.Transient);IEnumerable<ISimpleDependency>simpleDependendcies;SimpleDisposableObjectsimpleObject;using(varscope=LocalIocManager.CreateScope()){simpleDependendcies=scope.ResolveAll<ISimpleDependency>(new{myData=40});simpleObject=scope.Resolve<SimpleDisposableObject>(new{myData=40});}simpleDependendcies.ShouldAllBe(x=>x.MyData==40);simpleObject.MyData.ShouldBe(40);}[Fact]publicvoidIIocScopedResolver_Test_IsRegistered_ShouldWork(){LocalIocManager.Register<ISimpleDependency,SimpleDependency>(DependencyLifeStyle.Transient);using(varscope=LocalIocManager.CreateScope()){scope.IsRegistered<ISimpleDependency>().ShouldBe(true);scope.IsRegistered(typeof(ISimpleDependency)).ShouldBe(true);}}[Fact]publicvoidIIocScopedResolver_Test_Custom_Release_ShouldWork(){LocalIocManager.Register<ISimpleDependency,SimpleDependency>(DependencyLifeStyle.Transient);ISimpleDependencysimpleDependency;using(varscope=LocalIocManager.CreateScope()){simpleDependency=scope.Resolve<ISimpleDependency>();scope.Release(simpleDependency);}simpleDependency.DisposeCount.ShouldBe(1);}}publicinterfaceISimpleDependency:IDisposable{intMyData{get;set;}intDisposeCount{get;set;}}public>SimpleDependency:ISimpleDependency{publicintMyData{get;set;}publicintDisposeCount{get;set;}publicvoidDispose(){DisposeCount++;}}public>SimpleDependency2:ISimpleDependency{publicintDisposeCount{get;set;}publicintMyData{get;set;}publicvoidDispose(){DisposeCount++;}}public>SimpleDependency3:ISimpleDependency{publicintMyData{get;set;}publicintDisposeCount{get;set;}publicvoidDispose(){DisposeCount++;}}运行测试结果我的公众
【.Net】