上篇所说,本篇主要内容是讲述如何使用Autofac来管理整个平台的生命周期(初级)。


一、简述

插件式Web开发的同学应该还会记得PreApplicationStartMethod这个Assembly级别的Attribute,它可以在应用程序启动之初(Web启动之前)启动,一般我们用它来做一些插件资源拷贝、插件动态加载的工作。

[assembly: PreApplicationStartMethod(typeof(PreApplicationInit), "InitializePlugins")]

它所指定的代码:

 public static void InitializePlugins() {
     PluginManager.Current.Initialize();//插件管理器初始化
}

所有资源拷贝完毕,插件也被Assembly.Load完毕后,进入正式环节。我们将在Global.asxc的Application_Start方法中进行IOC的初始化。

二、Autofac初始化

第一步,采用Autofac的模块化初始化方式来初始化平台公共模块

internal static void BuildFrameworkIocEnviroment(){
     var builder = new ContainerBuilder();
     builder.RegisterModule(new MvcModule());
     builder.RegisterModule(new WebApiModule());
     builder.RegisterModule(new LoggingModule());
     builder.RegisterModule(new EventsModule());
     builder.RegisterModule(new CacheModule());
}

第二步,采用自动初始化方式将实现注册到IDependency,ISingletonDependency,ILifeScopeDependency,注册结果分别为:每次都重新生成,全局单例,每次请求周期内单例。

var dependency =assemblyTypes.Where(p => (typeof (IDependency)).IsAssignableFrom(p) && !p.IsAbstract && !p.IsInterface).ToArray();
var singleton = dependency.Where((typeof (ISingletonDependency)).IsAssignableFrom).ToArray();
var lifescope = dependency.Where((typeof (ILifeScopeDependency)).IsAssignableFrom).ToArray();
var perdependency = dependency.Except(singleton).Except(lifescope).ToArray();
containBuilder.RegisterTypes(singleton).AsImplementedInterfaces().SingleInstance();
containBuilder.RegisterTypes(lifescope).AsImplementedInterfaces().InstancePerLifetimeScope();
containBuilder.RegisterTypes(perdependency).AsImplementedInterfaces().InstancePerDependency();

三、Autofac的使用

为何需要用Autofac这类的IOC初始化容器?在插件式项目开发和基于接口编程的项目中,插件功能内聚,业务逻辑集中在接口实现上。IOC在这方面不经帮我们管理了对象的生命周期,而且方便地将功能由直接实现到面向接口编程(最常用的做法就是将实现注册为对应的接口)。

注册时我们采用了4中注册方式,在Web项目中应用最多的应该是请求周期内单例,所谓请求周期内单例,就是指,在一个请求到达Web程序域环境内,直到它获得Response离开应用程序域之间是单例的,而且各个请求互不干扰。这么做一是方便数据间的传输,二是很大程度上减少对象生成,节约了内存的开销。

如何做到“面向接口”编程?

首先我们定义一个接口以及它的实现。

public interface IService:IDependency
{
    int DoSomeBusiness();
}
public class IntService:IService{
    public int DoSomeBusiness(){
        //do something
        return 0;
    }
}

然后我们采用构造函数注入的方式使用它:

public class HomeController:Controller{
    
    private readonly IService _service;    
    public HomeController(IService service){
        _service=service;
    }
    
    public ActionResult Index(){
        var val=_service.DoSomeBusiness();
        return View(val);
    }
}

看,这就是最粗显地面向接口编程了,我们在页面上要显示的数据,是通过IService这个接口来实现的,如果业务逻辑改变,我们可以定义新的IService的实现。当然,本例中还是可以很简单地改造为属性构造的。

有关Autofac等的框架就简单介绍到这,博客园有关IOC、Autofac的介绍也有很多,就不细说,这里主要就介绍我所使用的项目中Autofac使用的部分。下一遍将介绍日志框架的实现。

蜗牛历险记(二) Web框架(上)的更多相关文章

  1. 蜗牛历险记(二) Web框架(中)

    上篇简单介绍了框架所使用的Autofac,采用Autofac提供的Ioc管理整个Web项目中所有对象的生命周期,实现框架面向接口编程.接下来介绍框架的日志系统. 一.介绍之前 框架日志是否有存在的必要 ...

  2. 蜗牛历险记(二) Web框架(下)

    Web框架第三篇--缓存篇 缓存的优劣很大程度上决定了框架的效率,一个有节操的缓存它应该是高效的,利用率高的,具备更多扩展功能的. 一.介绍之前 计算机各个硬件的运行效率是不一样的,CPU>&g ...

  3. Python之Web框架

    Python之Web框架: 一.  Web框架的本质: 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env pyth ...

  4. python笔记-19 javascript补充、web框架、django基础

    一.JavaScript的补充 1 正则表达式 1.1 test的使用 test 测试是否符合条件 返回true or false 1.2 exec的使用 exec 从字符串中截取匹配的字符 1.3 ...

  5. python各种web框架对比

    0 引言        python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的 ...

  6. python 十大web框架排名总结

    0 引言 python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的分析. 1 D ...

  7. 简单而直接的Python web 框架:web.py

    web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限制的. 先让大家感受一下web.py 的简单而强大: import web ur ...

  8. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  9. 二、Web框架实现

    一.简单web(socket) 在前一篇WEB框架概述一文中已经详细了解了:从浏览器键入一个URL到返回HTML内容的整个过程.说到底,本质上其实就是一个socket服务端,用户的浏览器其实就是一个s ...

随机推荐

  1. 如何在Linux上安装Tomcat

    Tomcat需要JDK的支持,所以安装Tomcat前先安装JDK. 一.首先到JDK官网下载与自己机器相应的JDK. 注意机器位数,Linux系统的话可以用uname -a命令查看系统信息,如果是Ub ...

  2. 显示创建一个表的SQL语句

    显示创建数据库中包的语句,从而可以方便的对表的结构进行修改和复制(当然还有其他的方式) 显示表结构: 显示创建表语句: show create table tablename;

  3. MSP430常见问题之LCD 显示驱动类

    Q1:晶体一般都是接32768,然后使用液晶很正常.我打算将晶体接6M的替换32768,那么液晶还能正常显示吗A1:看你所用的LCM 模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM ...

  4. (转载)Java NIO:NIO原理分析(二)

          NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用 ...

  5. arguments的用法

    arguments 对象 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argument ...

  6. 上传系列:ajaxupload.js

    ajaxupload.js 上次说了jquery.upload.js,这次再说一下ajaxupload.js,这个其实也比较简答,只有一个JS文件: html代码: $(function () { v ...

  7. SQL 行转列

    ---1.最简单的行转列/* 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94 想变成(得到如下结 ...

  8. Contoso 大学 - 5 – 读取关联数据

    原文 Contoso 大学 - 5 – 读取关联数据 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's ...

  9. Page 的生命周期学习小结(翻译兼笔记)

    初始化(Initialization) 页面被请求时,第一个被执行的总是下面接着执行的是 接着是 然后是 恢复和加载(Restore and Load) 接下来的 ViewState 被取回后,接着  ...

  10. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...