zoukankan      html  css  js  c++  java
  • Orchard 刨析:前奏曲

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

    从OrchardStarter认识Autofac

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

    Module注册

    builder.RegisterModule(new CacheModule());

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

    CacheModule


    Load方法:入口

    AttachToComponentRegistration方法:事件通知

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

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

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

    Code

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

    cacheHolderOrchardStarter中被注册

    builder.RegisterType<DefaultCacheHolder>().As<ICacheHolder>().SingleInstance();

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

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

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

    类型注册

    简单的类型注册

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

    生命周期

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

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

    瞬态

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

    单例

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

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

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

    一个小小的Demo

    image_thumb1image_thumb2

    参数注入

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

    image_thumb4

    一个简单的Demo

    服务类

    image_thumb6

    入口

    image_thumb8

    服务Key

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

    一个简单的Demo

    image_thumb12image_thumb13

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

    隐式关系类型

    Lazy

    Owned

    Func

    IEnumerable、IList 、ICollection

    Meta

    IIndex

    一个简单的Demo

    服务类

    image_thumb16image_thumb17

    入口

    image_thumb25image_thumb27

    写在最后

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

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

  • 相关阅读:
    仿百度排列图片预览插件-Simple Lightbox
    vue2.0移动端自定义性别选择提示框
    微信小程序踩坑记
    网页里如何使用js禁用F12事件
    使用 html2canvas 实现浏览器截图
    h5、jq 移动端评论点攒功能
    js 数字递增特效 仿支付宝我的财富 HTML5
    aos.js超赞页面滚动元素动画jQuery动画库
    简洁AngularJS框架后台管理系统bootstrap后台模板
    Ionic 的 ng-class 在聊天功能上面的巧妙运用
  • 原文地址:https://www.cnblogs.com/ants/p/3732295.html
Copyright © 2011-2022 走看看