ABP開源項目最近有點小火,還開展了線下活動。本着學習DDD的心態與學習開源代碼的的好奇,我也看了一遍ABP源碼,在此將本身學習ABP的一些心得記錄下來。app
做爲一種解耦的方式,一些IoC框架就成了項目了核心。好比蔣金楠的VideoMall與陳青陽的Byteart Retail項目都是使用Unity。而ABP則是使用Castle。框架
Register與Reslove是IoC基本功能,向容器中注類型對應關係再向容器按注入規則索取對象實體。ABP爲Register與Resolve分別定義接口:IIocRegistrar、IocResolver,再由IIocManager繼承這兩個接口,因此在IIocManager中統一了Register與Resolve,其中IIocManger中定義了IWindsorContainer。再由IocManager去實現IIoCManager.這樣就造成了一個完整的, Register與Resolve。類結構以下:ide
其中,IoCManager當中用了單例去維持Register內容。學習
ABP對於生命週期管理提供了兩種方式。spa
系統提供了一輩子命週期的枚舉類型:DependencyLifeStylecode
/// <summary> /// Lifestyles of types used in dependency injection system. /// </summary> public enum DependencyLifeStyle { /// <summary> /// Singleton object. Created a single object on first resolving /// and same instance is used for subsequent resolves. /// </summary> Singleton, /// <summary> /// Transient object. Created one object for every resolving. /// </summary> Transient }
再IIoCResgister接口中重載了四個方法Register都有DependencyLifeStyle參數 對象
系統識別的方式主要就對整個程序集進行注入,ABP提供了兩個有關生命週期的接口,分別是:ISingletonDependency與ITransientDependency blog
同時IIoCRegister接口中有兩個RegisterAssemblyByConvention方法, 繼承
這兩個方法都用到了Assembly做爲參數。接口
關於這種方式的注入ABP提供了一個Assembly容器接口:IConventionalRegistrationContext與其默認實現ConventionalRegistrationContext,一個Assembly解析接口:IConventionalDependencyRegistrar及其默認實現BasicConventionalRegistrar,還有一配置ContextConventionalRegistrationConfig
這兩個接口與一個配置類共同解析程序集中可依賴注入的類型。
其中主要解析與注入工做由IConventionalDependencyRegistrar中的RegisterAssembly方法完成,其具體實現爲:
public void RegisterAssembly(IConventionalRegistrationContext context) { //Transient context.IocManager.IocContainer.Register( Classes.FromAssembly(context.Assembly) .IncludeNonPublicTypes() .BasedOn<ITransientDependency>() .WithService.Self() .WithService.DefaultInterfaces() .LifestyleTransient() ); //Singleton context.IocManager.IocContainer.Register( Classes.FromAssembly(context.Assembly) .IncludeNonPublicTypes() .BasedOn<ISingletonDependency>() .WithService.Self() .WithService.DefaultInterfaces() .LifestyleSingleton() ); //Windsor Interceptors context.IocManager.IocContainer.Register( Classes.FromAssembly(context.Assembly) .IncludeNonPublicTypes() .BasedOn<IInterceptor>() .WithService.Self() .LifestyleTransient() ); }
在源代碼當中咱們能夠看到對攔截器(IInterceptor)也有處理
ABP默認只提供兩種生命週期類型:Singleton(單例),Transient(實例)兩種,對於其餘的類型暫時不知道怎麼處理。
ABP爲Resolve提供一個Wrapper,這個Wrapper的主要是對容器對象的Dispose管理
在其實現DisposableDependencyObjectWrapper<T>中有體現:
internal class DisposableDependencyObjectWrapper<T> : IDisposableDependencyObjectWrapper<T> { private readonly IIocResolver _iocResolver; public T Object { get; private set; } public DisposableDependencyObjectWrapper(IIocResolver iocResolver, T obj) { _iocResolver = iocResolver; Object = obj; } public void Dispose() { _iocResolver.Release(Object); } }
AbpCoreInstaller主要實現了ABP自身的注入。