ABP之依賴注入

寫在開頭

ABP開源項目最近有點小火,還開展了線下活動。本着學習DDD的心態與學習開源代碼的的好奇,我也看了一遍ABP源碼,在此將本身學習ABP的一些心得記錄下來。app

 

做爲核心的IoC

做爲一種解耦的方式,一些IoC框架就成了項目了核心。好比蔣金楠的VideoMall與陳青陽的Byteart Retail項目都是使用Unity。而ABP則是使用Castle。框架

 

Register與Resolve

Register與Reslove是IoC基本功能,向容器中注類型對應關係再向容器按注入規則索取對象實體。ABP爲Register與Resolve分別定義接口:IIocRegistrar、IocResolver,再由IIocManager繼承這兩個接口,因此在IIocManager中統一了Register與Resolve,其中IIocManger中定義了IWindsorContainer。再由IocManager去實現IIoCManager.這樣就造成了一個完整的, Register與Resolve。類結構以下:ide

其中,IoCManager當中用了單例去維持Register內容。學習

生命週期

ABP對於生命週期管理提供了兩種方式。spa

  1. 手工注入

系統提供了一輩子命週期的枚舉類型: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
    }
View Code

 

 

IIoCResgister接口中重載了四個方法Register都有DependencyLifeStyle參數 對象

  1. 系統自動識別

系統識別的方式主要就對整個程序集進行注入,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()
                );
        }
View Code

 

在源代碼當中咱們能夠看到對攔截器(IInterceptor)也有處理

ABP默認只提供兩種生命週期類型:Singleton(單例),Transient(實例)兩種,對於其餘的類型暫時不知道怎麼處理。

 

Resolve的Wrapper

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);
        }
    }
View Code

 

 

AbpCoreInstaller

AbpCoreInstaller主要實現了ABP自身的注入。

相關文章
相關標籤/搜索