蜗牛历险记(二) Web框架(上)
接上篇所说,本篇主要内容是讲述如何使用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框架(上)的更多相关文章
- 蜗牛历险记(二) Web框架(中)
上篇简单介绍了框架所使用的Autofac,采用Autofac提供的Ioc管理整个Web项目中所有对象的生命周期,实现框架面向接口编程.接下来介绍框架的日志系统. 一.介绍之前 框架日志是否有存在的必要 ...
- 蜗牛历险记(二) Web框架(下)
Web框架第三篇--缓存篇 缓存的优劣很大程度上决定了框架的效率,一个有节操的缓存它应该是高效的,利用率高的,具备更多扩展功能的. 一.介绍之前 计算机各个硬件的运行效率是不一样的,CPU>&g ...
- Python之Web框架
Python之Web框架: 一. Web框架的本质: 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env pyth ...
- python笔记-19 javascript补充、web框架、django基础
一.JavaScript的补充 1 正则表达式 1.1 test的使用 test 测试是否符合条件 返回true or false 1.2 exec的使用 exec 从字符串中截取匹配的字符 1.3 ...
- python各种web框架对比
0 引言 python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的 ...
- python 十大web框架排名总结
0 引言 python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的分析. 1 D ...
- 简单而直接的Python web 框架:web.py
web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限制的. 先让大家感受一下web.py 的简单而强大: import web ur ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- 二、Web框架实现
一.简单web(socket) 在前一篇WEB框架概述一文中已经详细了解了:从浏览器键入一个URL到返回HTML内容的整个过程.说到底,本质上其实就是一个socket服务端,用户的浏览器其实就是一个s ...
随机推荐
- LeetCode 213
House Robber II Note: This is an extension of House Robber. After robbing those houses on that stree ...
- 汇总#pragma用法
这几天忙着去复习了,但是心理总是不踏实,不到实验室里就觉得一天的生活变了个样,现在还是晚上来这里“搞起”吧,白天还是在复习准备考试.因为要开始学习freescale,准备明年的比赛了,觉得是时候开始搞 ...
- C#电脑自动关机代码指令
Process p = new Process();//实例化一个独立进程 p.StartInfo.FileName = "cmd.exe";//进程 ...
- Django学习--9 Admin
1.vim settings.py 打开 'django.contrib.admin' vim urls.py 打开 from django.contrib import admin (注意 ...
- 给label text 上色 && 给textfiled placeholder 上色
1.给label text 上色: NSInteger stringLength = ; stringLength = model.ToUserNickName.length; NSMutableAt ...
- c#winform音乐制作软件
C#音乐播放器 这个音乐播放器是winform 功能有:(括号中是值得提高的部分) 1:登陆提示(查询数据库) 2:皮肤换肤的功能(能右键或者通过按键就能实现) 3:图片的轮换(图片的地址从数据库中抽 ...
- 【转载】Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载六)Linux的网络配置
本篇是Linux小白最佳实践第6篇,目的就是让白菜们了解Linux网络是如何配置的.Linux系统在服务器市场占有很大的份额,尤其在互连网时代,要使用计算机就离不开网络. 想每天能听到小妞的语音播报, ...
- 绝对URL和相对URL
什么是URL? 应用举例:可以是图片等资源地址,浏览器地址栏的网址等等 Uniform Resource Locator 统一资源定位符 http://www.123.com/infor/index. ...
- PHP的语言规范
PHP的语言规范: 1.php中的变量名区分大小写,但是函数名,类名,方法名,不区分大小写,但建议区分大小写 2.php代码必须书写在<?php?>(php标签),开启标记(<?ph ...
- SQLite学习心得
SQLite是一款很有名气的小型开源跨平台数据库,作为目前最流行的开源嵌入式关系型数据库,在系统结构设计中正在扮演着越来越重要的角色. 本文主要沿着 http://www.cppblog.com/we ...