【转】 依赖注入框架Autofac的简单使用
Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的。于是,今天抽空研究了下它。下载地址:http://code.google.com/p/autofac/downloads/list
1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,这也是本篇文章重点使用的Autofac的类库。
2)创建一个控制台工程,并且引用以上的DLL文件。创建一个数据库操作接口IDatabase.cs:
/// <summary>
/// Database operate interface
/// </summary>
public interface IDatabase
{
string Name { get; }
void Select(string commandText);
void Insert(string commandText);
void Update(string commandText);
void Delete(string commandText);
}
这里包含CRUD四种操作的方法。
3)创建两种数据库的操作类,SqlDatabase.cs以及OracleDatabase.cs:
public class SqlDatabase : IDatabase
{
public string Name
{
get { return "sqlserver"; }
}
public void Select(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a query sql in {1}!", commandText, Name));
}
public void Insert(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a insert sql in {1}!", commandText, Name));
}
public void Update(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a update sql in {1}!", commandText, Name));
}
public void Delete(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a delete sql in {1}!", commandText, Name));
}
}
以及
public class OracleDatabase : IDatabase
{
public string Name
{
get { return "oracle"; }
}
public void Select(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a query sql in {1}!", commandText, Name));
}
public void Insert(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a insert sql in {1}!", commandText, Name));
}
public void Update(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a update sql in {1}!", commandText, Name));
}
public void Delete(string commandText)
{
Console.WriteLine(string.Format("'{0}' is a delete sql in {1}!", commandText, Name));
}
}
4)接着创建一个数据库管理器DatabaseManager.cs:
public class DatabaseManager
{
IDatabase _database;
public DatabaseManager(IDatabase database)
{
_database = database;
}
public void Search(string commandText)
{
_database.Select(commandText);
}
public void Add(string commandText)
{
_database.Insert(commandText);
}
public void Save(string commandText)
{
_database.Update(commandText);
}
public void Remove(string commandText)
{
_database.Delete(commandText);
}
}
5)在控制台中,编写以下测试程序:
var builder = new ContainerBuilder();
builder.RegisterType<DatabaseManager>();
builder.RegisterType<SqlDatabase>().As<IDatabase>();
using (var container = builder.Build())
{
var manager = container.Resolve<DatabaseManager>();
manager.Search("SELECT * FORM USER");
}
运行结果:

分析:
这里通过ContainerBuilder方法RegisterType对DatabaseManager进行注册,当注册的类型在相应得到的容器中可以Resolve你的DatabaseManager实例。
builder.RegisterType<SqlDatabase>().As<IDatabase>();通过AS可以让DatabaseManager类中通过构造函数依赖注入类型相应的接口。
Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。
同样地,如果你修改数据库类型注册为:
builder.RegisterType<OracleDatabase>().As<IDatabase>();
运行结果:

6)显然以上的程序中,SqlDatabase或者OracleDatabase已经暴露于客户程序中了,现在我想将该类型选择通过文件配置进行读取。Autofac自带了一个Autofac.Configuration.dll 非常方便地对类型进行配置,避免了程序的重新编译。
修改App.config:
<configuration>
<configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
</configSections>
<autofac defaultAssembly="AutofacDemo">
<components>
<component type="AutofacDemo.SqlDatabase, AutofacDemo" service="AutofacDemo.IDatabase" />
</components>
</autofac>
</configuration>
通过Autofac.Configuration.SectionHandler配置节点对组件进行处理。
对应的客户端程序改为:
var builder = new ContainerBuilder();
builder.RegisterType<DatabaseManager>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
using (var container = builder.Build())
{
var manager = container.Resolve<DatabaseManager>();
manager.Search("SELECT * FORM USER");
}
运行结果:

7)另外还有一种方式,通过Register方法进行注册:
var builder = new ContainerBuilder();
//builder.RegisterType<DatabaseManager>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>()));
using (var container = builder.Build())
{
var manager = container.Resolve<DatabaseManager>();
manager.Search("SELECT * FORM USER");
}
得到结果也是一样的。
8)现在我想通过一个用户类来控制操作权限,比如增删改的权限,创建一个用户类:
/// <summary>
/// Id Identity Interface
/// </summary>
public interface Identity
{
int Id { get; set; }
}
public class User : Identity
{
public int Id { get; set; }
public string Name { get; set; }
}
修改DatabaseManager.cs代码:
public class DatabaseManager
{
IDatabase _database;
User _user;
public DatabaseManager(IDatabase database) : this(database, null)
{
}
public DatabaseManager(IDatabase database, User user)
{
_database = database;
_user = user;
}
/// <summary>
/// Check Authority
/// </summary>
/// <returns></returns>
public bool IsAuthority()
{
bool result = _user != null && _user.Id == && _user.Name == "leepy" ? true : false;
if (!result)
Console.WriteLine("Not authority!");
return result;
}
public void Search(string commandText)
{
_database.Select(commandText);
}
public void Add(string commandText)
{
if (IsAuthority())
_database.Insert(commandText);
}
public void Save(string commandText)
{
if (IsAuthority())
_database.Update(commandText);
}
public void Remove(string commandText)
{
if (IsAuthority())
_database.Delete(commandText);
}
}
在构造函数中增加了一个参数User,而Add,Save,Remove增加了权限判断。
修改客户端程序:
User user = new User { Id = , Name = "leepy" };
var builder = new ContainerBuilder();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
builder.RegisterInstance(user).As<User>();
builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>(), c.Resolve<User>()));
using (var container = builder.Build())
{
var manager = container.Resolve<DatabaseManager>();
manager.Add("INSERT INTO USER ...");
}
运行结果:

分析:
builder.RegisterInstance(user).As<User>();注册User实例。
builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>(), c.Resolve<User>()));通过Lampda表达式注册DatabaseManager实例。
如果这里我修改User的属性值:
User user = new User { Id = 2, Name = "zhangsan" };
运行结果:

说明该用户无权限操作。
源代码下载:AutofacDemo.rar
转自:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html
【转】 依赖注入框架Autofac的简单使用的更多相关文章
- [转]依赖注入框架Autofac的简单使用
本文转自:http://www.nopchina.net/post/autofac.html 话说nopcommerce底层用到了autofac框架,这里转了一篇文章简单说明一下: Autofac是一 ...
- 依赖注入框架Autofac的简单使用
http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html Autofac是一款IOC框架,比较于其他的IOC框架,如S ...
- 依赖注入框架Autofac源码阅读指南
官方网站http://autofac.org/ 源码下载地址https://github.com/autofac/Autofac 最新版本是3.5.0 下载后大小为37M,包括源码,示例文档,与之相关 ...
- .NET Core 中依赖注入框架详解 Autofac
本文将通过演示一个Console应用程序和一个ASP.NET Core Web应用程序来说明依赖注入框架Autofac是如何使用的 Autofac相比.NET Core原生的注入方式提供了强大的功能, ...
- webapi框架搭建-依赖注入之autofac
前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...
- .net mvc web api Autofac依赖注入框架-戈多编程
今天自己搭了一套基于三层的依赖注入mvc web api 的依赖注入框架,在此总结下相关配置 1.设置应用程序的.net Framework版本为 4.5 2.通过Nuget 安装autofac包 I ...
- 简单谈谈Hilt——依赖注入框架
今天继续Jetpack专题,相信不少的朋友都使用过Dagger,也放弃过Dagger,因为实在太难用了.所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架--Hilt,今天一起来看看 ...
- .net core程序中使用微软的依赖注入框架
我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
随机推荐
- 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?并在Github注册账户,写一篇博客记录注册的过程。
问题一:上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?(以下内容为网上查询所得) Microsoft TFS(Team Foundation Server): 优点: ...
- 基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...
- [源码]NumberToUpper 数字转中文
使用时需开启unsafe选项 构造函数有4个参数 number : 数字文本 isSimplified : 是否只使用简体中文,默认:false isMoney : 是否是金额模式(忽略小数点后3位, ...
- Model模型和Module模块的区别
资料是从网上找的,具体是谁最先写的,不清楚了. Model通常是指模型.这个模型也许是你需求分析出来的, 也许是你算法做出来的. 不过最大可能是MVC的网站,或者是GUI开发模式中的M里的那个模型. ...
- Oracle数据库面试题【转载】
1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...
- 黑马程序员_java08_多线程
转载于:http://www.itxuexiwang.com/plus/view.php?aid=148 线程是程序中可以并行执行的任务. java运行系统总是选当前优先级最高的处于就绪状态的线程来执 ...
- lua如何调用C++函数
第一步是定义函数.所有在Lua中被调用的C/C++函数将使用下面一类指针进行调用: typedef int (*lua_CFunction) (lua_State *L); 换句话说,函数必须要以Lu ...
- jQuery_04之第三方、自定义
1.第三方插件: ①日期:layDate:不依赖于jquery 使用:html:<input class="laydate-icon"> css:引入laydat ...
- 【WP开发】如何处理溢出的文本
本文内容适用于Runtime App框架 在用户界面上显示文本,用得严重多的是TextBlock,凡是轻量级的东西都会很常用,TextBlock对于显示简单.少量的文本内容相当适合,不过,在我们考虑要 ...
- Ubuntu 14.04上安装caffe
本来实在windows 10上尝试安装caffe,装了一天没装上,放弃; 改在windows上装ubuntu的双系统,装了一个下午,不小心windows的系统盘被锁死了,也不会unlock?只好含泪卸 ...