博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Orchard 刨析:前奏曲
阅读量:6225 次
发布时间:2019-06-21

本文共 3367 字,大约阅读时间需要 11 分钟。

Orchard中大量使用了依赖注入,而实现依赖注入的组件就是Autofac,它在Orchard中扮演者非常重要的角色,多租户如是,模块如是,工作区也如是。今天就来讲讲Autofac在Orchard中的应用。

从OrchardStarter认识Autofac

OrchardStarter中向Ioc容器中注册了大量的服务,在此中的服务也是“root”域,根域。

Module注册

builder.RegisterModule(new CacheModule());

这段话代表了注册一个Module,我们看看CacheModule内又是什么内容。

CacheModule    public class CacheModule : Module {        protected override void Load(ContainerBuilder builder) {            builder.RegisterType
() .As
() .InstancePerDependency(); } protected override void AttachToComponentRegistration(Autofac.Core.IComponentRegistry componentRegistry, Autofac.Core.IComponentRegistration registration) { var needsCacheManager = registration.Activator.LimitType .GetConstructors() .Any(x => x.GetParameters() .Any(xx => xx.ParameterType == typeof(ICacheManager))); if (needsCacheManager) { registration.Preparing += (sender, e) => { var parameter = new TypedParameter( typeof(ICacheManager), e.Context.Resolve
(new TypedParameter(typeof(Type), registration.Activator.LimitType))); e.Parameters = e.Parameters.Concat(new[] { parameter }); }; } } }

Load方法:入口

AttachToComponentRegistration方法:事件通知

首先在Load方法内将DefaultCacheManager注册为ICacheManager并且是瞬态的。

AttachToComponentRegistration方法中判断如果其他服务需要服务类型为ICacheManager的服务,则在该服务准备前将ICacheManager服务解析并赋给调用服务。

这边有意思的是Autofac默认支持构造函数注入,为什么还要写这么一段复杂的代码呢?我们来看一看DefaultCacheManager这个类。

Code        ///         /// Constructs a new cache manager for a given component type and with a specific cache holder implementation.        ///         /// The component to which the cache applies (context).        /// The cache holder that contains the entities cached.        public DefaultCacheManager(Type component, ICacheHolder cacheHolder) {            _component = component;            _cacheHolder = cacheHolder;        }

 

可以看到DefaultCacheManager的构造函数有类型为Type的参数componet和类型为ICacheHolder参数的cacheHolder

cacheHolderOrchardStarter中被注册

builder.RegisterType
().As
().SingleInstance();

component的参数没有找到在哪被注册。

聪明的人可能已经猜到了AttachToComponentRegistration方法内的内容就是为了传入这个类型为Type名称叫component的参数。。可真不容易啊。

这个方法中他把需要使用到ICacheManager服务的类型当作component传给了DefaultCacheManager,至于为什么我们后面在做分析。

类型注册

简单的类型注册

builder.RegisterType
().As
().SingleInstance();
同时注册多个服务
builder.RegisterTypes(new[] { typeof(WalmartShop), typeof(CarrefourShop) }).As
();

生命周期

在Autofac中常用的4种生命周期分别是:瞬态、单例、当前域单例、指定域下单例、某一个对象下的共享域。

其实说白了就只有2种:瞬态和单例,因为Autofac支持子域(子容器)所以才衍生出很多种的生命周期,除上之外官方还提供了在当前请求单例等扩展。

瞬态

每一次解析服务时服务实例都是一个新的实例。

单例

每一次解析服务时如果服务以及被创建则直接返回否则创建一个实例并返回。

Autofac中的域非常的惊艳。默认的域Tag为”root”。

在Autofac中有一个概念跟面向对象很像,子域可以拥有根域的服务而根域不可以拥有子域的服务,是不是跟oop中的子类跟父类很像。

一个小小的Demo

参数注入

这边其实是对服务的构造函数进行注入。

一个简单的Demo

服务类

入口

服务Key

如果我们同时将WalmartShop和CarrefourShop注册为IShop我们要怎么区分调用的服务呢?别担心Autofac考虑到了。

一个简单的Demo

Named其实就是Keyed的重载,反编译代码就可以看到两者唯一的区别就是Named方法限制了参数必须为string类型而Keyed方法则不限制参数类型为object。

隐式关系类型

Lazy

Owned

Func

IEnumerable、IList 、ICollection

Meta

IIndex

一个简单的Demo

服务类

入口

写在最后

这边讲了OrchardStarter中常用的注册方式,对后面的内容有很大的作用,后面还会涉及Autofac中更多的东西,会根据章节进行讲解。

为了本系列的读者有更好的交流环境提供QQ群一个:299744835

你可能感兴趣的文章
Go Main测试实现原理剖析
查看>>
安装本地yum源
查看>>
系统性能调节命令ulimit
查看>>
AS3音效管理
查看>>
LYNC2013部署系列PART1:LYNC2013介绍和基础架构准备
查看>>
ssh公钥登录无效
查看>>
mysql修改密码
查看>>
开放、高效且高性价的Dell GPU解决方案
查看>>
深入理解缓存cache(2):各级缓存测试
查看>>
oltp和olap
查看>>
日常工作小结(三)
查看>>
安全传输数据的实现
查看>>
用命令查看win2003得内存条个数
查看>>
阿里珍贵技术资料免费下载
查看>>
linux 出现running guests on default URT情况解决
查看>>
Juniper ScreenOS下的MIP, VIP, DIP, NAT-src, NAT-dst区别
查看>>
896.Montonic Array - LeetCode
查看>>
LNMP之源码自定义安装
查看>>
beego+mysql的美剧网站源码
查看>>
Android的Fragment
查看>>