Asp.Net Web Forms/MVC/Console App中使用Autofac
本来简单介绍了Autofac在Asp.Net Web Forms中的应用,后来又添加了mvc、控制台应用程序中使用Autofac,详情请看源码。
ASP.NET Web Forms使用Autofac,至少需要一下步骤:
1,引用Autofac程序集。
2,添加Autofac Web Modules 到 Web.config。
3,在Global.asax中实现IContainerProviderAccessor接口。
我们创建一个ASP.NET Web Forms项目,命名为WebFormStudy。
添加引用
添加引用的最简单方式就是用NuGet,右击WebFormStudy项目下的References,选择Manage NuGet Packages,如下图:

在Search Online中输入auto.web字样,Autofac WebForms Intergration 就搜索到了,点击Install。
安装完后,我们就可以在References中看到添加了Autofac.dll和Autofac.Integration.Web.dll,如下图:

添加Modules到Web.config
Autofac管理组件的生命周期并且添加依赖注入到Asp.net管道是通过IHttpModule实现的(注:在HttpApplication 初始化过程中,会根据配置文件加载并初始化相应的实现了IHttpModule接口的HttpModule 对象。对于HttpApplication来说,在它处理HTTP 请求的不同阶段会触发不同的事件,而HttpModule 的意义在于通过注册HttpApplication 的相应的事件,将所需的操作注入整个HTTP 请求的处理流程。ASP.NET 的很多功能,比如身份验证、授权、缓存等,都是通过相应的HttpModule 实现的。摘自:Asp.net Mvc4框架揭秘),你需要在web.config中配置这些Modules。
幸运的是,如果通过NuGet添加Autofac程序集,在安装的时候自动在Web.config中配置了相应的Modules,如下图:

Global.aszx中实现IContainerProviderAccessor接口
依赖注入模块需要HttpApplication实例实现IContainerProviderAccessor接口。一个完整的全局Application类如下所示:
public class Global : HttpApplication,IContainerProviderAccessor
{
static IContainerProvider _containerProvider;
public IContainerProvider ContainerProvider
{
get { return _containerProvider; }
}
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
#region 我们添加的代码
var builder = new ContainerBuilder();
//注册将被通过反射创建的组件
builder.RegisterType<DatabaseManager>();
builder.RegisterType<OracleDatabase>().As<IDatabase>();
_containerProvider = new ContainerProvider(builder.Build());
#endregion
}
}
DatabaseManager、OracleDatabase等类代码:
public interface IDatabase
{
string Name { get; } string Select(string commandText); string Insert(string commandText); string Update(string commandText); string Delete(string commandText);
}
IDatabase
public class DatabaseManager
{
IDatabase _database; public DatabaseManager(IDatabase database)
{
_database = database;
} public string Search(string commandText)
{
return _database.Select(commandText);
} public string Add(string commandText)
{
return _database.Insert(commandText);
} public string Save(string commandText)
{
return _database.Update(commandText);
} public string Remove(string commandText)
{
return _database.Delete(commandText);
} }
DatabaseManager
public class SqlDatabase : IDatabase
{
public string Name
{
get { return "sqlserver"; }
} public string Select(string commandText)
{
return string.Format("'{0}' is a query sql in {1}!", commandText, Name);
} public string Insert(string commandText)
{
return string.Format("'{0}' is a insert sql in {1}!", commandText, Name);
} public string Update(string commandText)
{
return string.Format("'{0}' is a update sql in {1}!", commandText, Name);
} public string Delete(string commandText)
{
return string.Format("'{0}' is a delete sql in {1}!", commandText, Name);
}
}
SqlDatabase
public class OracleDatabase : IDatabase
{
public string Name
{
get { return "oracle"; }
} public string Select(string commandText)
{
return string.Format("'{0}' is a query sql in {1}!", commandText, Name);
} public string Insert(string commandText)
{
return string.Format("'{0}' is a insert sql in {1}!", commandText, Name);
} public string Update(string commandText)
{
return string.Format("'{0}' is a update sql in {1}!", commandText, Name);
} public string Delete(string commandText)
{
return string.Format("'{0}' is a delete sql in {1}!", commandText, Name);
}
}
OracleDatabase
运行下,糟糕,报错了,如下图:

没关系,注释如下配置信息:

再次运行,ok,如下图:

参考引用: http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html
Asp.Net Web Forms/MVC/Console App中使用Autofac的更多相关文章
- 如何在 ASP.Net Web Forms 中使用依赖注入
依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...
- 【翻译】使用Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定
原文地址:http://www.dotnetjalps.com/2013/05/Simple-data-binding-with-Knockout-Web-API-and-ASP-Net-Web-Fo ...
- Asp.Net学习进度备忘(第一步:ASP.NET Web Forms)
书签:“Web Pages”和“MVC”跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1.ASP. ...
- ASP.NET Web Forms的改进
虽然ASP.NET Web Forms不是vNext计划的一部分,但它并没有被忽视.作为Visual Studio 2013 Update 2的一部分,它重新开始支持新工具.EF集成和Roslyn. ...
- ASP.NET Web Forms 4.5的新特性
作者:Parry出处:http://www.cnblogs.com/parry/ 一.强类型数据控件 在出现强类型数据控件前,我们绑定数据控件时,前台一般使用Eval或者DataBinder.Eval ...
- Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定
使用Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定 原文地址:http://www.dotnetjalps.com/2013/05/Simple-da ...
- ASP.NET Web Forms 的 DI 應用範例
跟 ASP.NET MVC 与 Web API 比起来,在 Web Forms 应用程式中使用 Dependency Injection 要来的麻烦些.这里用一个范例来说明如何注入相依物件至 Web ...
- [转]Bootstrap 3.0.0 with ASP.NET Web Forms – Step by Step – Without NuGet Package
本文转自:http://www.mytecbits.com/microsoft/dot-net/bootstrap-3-0-0-with-asp-net-web-forms In my earlier ...
- Using Friendly URLs in ASP.NET Web Forms
Introduction Websites often need to generate SEO friendly URLs. In ASP.NET Web Forms applications, a ...
随机推荐
- Thunder团队第一周 - Scrum会议2
Scrum会议2 小组名称:Thunder 项目名称:待定 Scrum Master:李传康 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传康(M ...
- Java学习个人备忘录之文档注释
文档注释 单行注释用 // 多行注释有两种,第一种是 /* 内容 */,第二种是/** 内容 */. 这两种多行注释的区别是/** 内容 */这种注释可以生成一个该文件的注释文档,下面是演示代码. A ...
- databales详解(一)
学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...
- 福大软工1816:Alpha(6/10)
Alpha 冲刺 (6/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.组织会议 2.帮助队员解决 ...
- LintCode-7-二叉树的序列化和反序列化
二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为"序列化",读取文件后重建同样的二叉树被称为"反序列化". 如 ...
- activity属性设置大全
activity属性设置大全 android:allowTaskReparenting=["true" | "false"] 是否允许activ ...
- 主流 Kubernetes 发行版梳理
2014 年,Kubernetes 作为内部 Google orchestrator Borg 开源版本推出,目前已是最成功和发展最快的 IT 基础架构项目之一.2018 年,Kubernetes 已 ...
- 【Json】C#格式化JSON字符串
很多时候我们需要将json字符串以 { "status": 1, "sum": 9 }这种方式显示,而从服务端取回来的时候往往是这样 {&quo ...
- BZOJ4300 绝世好题(动态规划)
设f[i][j]为前i个数中所选择的最后一个数在第j位上为1时的最长序列长度,转移显然. #include<iostream> #include<cstdio> #includ ...
- Python列表去重的三种方法
1. 列表去重 li = [] for item in my_list: if item not in li: li.append(item) 2.集合去重 list(set(my_list)) 3. ...