依赖注入框架Autofac的简单使用

摘要:
Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的。下载地址:http://code.google.com/p/autofac/downloads/list1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,这也是本篇文章重点使用的Autofac的类库。创建一个数据库操作接口IDatabase.cs://////Databaseoperateinterface///publicinterfaceIDatabase{stringName{get;}voidSelect;voidInsert;voidUpdate;voidDelete;}这里包含CRUD四种操作的方法。3)创建两种数据库的操作类,SqlDatabase.cs以及OracleDatabase.cs:publicclassSqlDatabase:IDatabase{publicstringName{get{return"sqlserver";}}publicvoidSelect{Console.WriteLine(string.Format("'{0}'isaquerysqlin{1}!builder.RegisterType().As();通过AS可以让DatabaseManager类中通过构造函数依赖注入类型相应的接口。

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>///Databaseoperateinterface
///</summary>publicinterfaceIDatabase
{
stringName{get;}
voidSelect(stringcommandText);
voidInsert(stringcommandText);
voidUpdate(stringcommandText);
voidDelete(stringcommandText);
}
复制代码

这里包含CRUD四种操作的方法。

3)创建两种数据库的操作类,SqlDatabase.cs以及OracleDatabase.cs:

复制代码
publicclassSqlDatabase:IDatabase
{
publicstringName
{
get{return"sqlserver";}
}
publicvoidSelect(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isaquerysqlin{1}!",commandText,Name));
}
publicvoidInsert(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isainsertsqlin{1}!",commandText,Name));
}
publicvoidUpdate(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isaupdatesqlin{1}!",commandText,Name));
}
publicvoidDelete(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isadeletesqlin{1}!",commandText,Name));
}
}
复制代码

以及

复制代码
publicclassOracleDatabase:IDatabase
{
publicstringName
{
get{return"oracle";}
}
publicvoidSelect(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isaquerysqlin{1}!",commandText,Name));
}
publicvoidInsert(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isainsertsqlin{1}!",commandText,Name));
}
publicvoidUpdate(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isaupdatesqlin{1}!",commandText,Name));
}
publicvoidDelete(stringcommandText)
{
Console.WriteLine(
string.Format("'{0}'isadeletesqlin{1}!",commandText,Name));
}
}
复制代码

4)接着创建一个数据库管理器DatabaseManager.cs:

复制代码
publicclassDatabaseManager
{
IDatabase_database;
publicDatabaseManager(IDatabasedatabase)
{
_database
=database;
}
publicvoidSearch(stringcommandText)
{
_database.Select(commandText);
}
publicvoidAdd(stringcommandText)
{
_database.Insert(commandText);
}
publicvoidSave(stringcommandText)
{
_database.Update(commandText);
}
publicvoidRemove(stringcommandText)
{
_database.Delete(commandText);
}
}
复制代码

5)在控制台中,编写以下测试程序:

复制代码
varbuilder=newContainerBuilder();
builder.RegisterType
<DatabaseManager>();
builder.RegisterType
<SqlDatabase>().As<IDatabase>();
using(varcontainer=builder.Build())
{
varmanager
=container.Resolve<DatabaseManager>();
manager.Search(
"SELECT*FORMUSER");
}
复制代码

运行结果:

image

分析:

这里通过ContainerBuilder方法RegisterType对DatabaseManager进行注册,当注册的类型在相应得到的容器中可以Resolve你的DatabaseManager实例。

builder.RegisterType<SqlDatabase>().As<IDatabase>();通过AS可以让DatabaseManager类中通过构造函数依赖注入类型相应的接口。

Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。

同样地,如果你修改数据库类型注册为:

builder.RegisterType<OracleDatabase>().As<IDatabase>();

运行结果:

image

6)显然以上的程序中,SqlDatabase或者OracleDatabase已经暴露于客户程序中了,现在我想将该类型选择通过文件配置进行读取。Autofac自带了一个Autofac.Configuration.dll 非常方便地对类型进行配置,避免了程序的重新编译。

修改App.config:

复制代码
<configuration><configSections><sectionname="autofac"type="Autofac.Configuration.SectionHandler,Autofac.Configuration"/></configSections><autofacdefaultAssembly="AutofacDemo"><components><componenttype="AutofacDemo.SqlDatabase,AutofacDemo"service="AutofacDemo.IDatabase"/></components></autofac></configuration>
复制代码

通过Autofac.Configuration.SectionHandler配置节点对组件进行处理。

对应的客户端程序改为:

复制代码
varbuilder=newContainerBuilder();
builder.RegisterType
<DatabaseManager>();
builder.RegisterModule(
newConfigurationSettingsReader("autofac"));
using(varcontainer=builder.Build())
{
varmanager
=container.Resolve<DatabaseManager>();
manager.Search(
"SELECT*FORMUSER");
}
复制代码

运行结果:

image

7)另外还有一种方式,通过Register方法进行注册:

复制代码
varbuilder=newContainerBuilder();
//builder.RegisterType<DatabaseManager>();builder.RegisterModule(newConfigurationSettingsReader("autofac"));
builder.Register(c
=>newDatabaseManager(c.Resolve<IDatabase>()));
using(varcontainer=builder.Build())
{
varmanager
=container.Resolve<DatabaseManager>();
manager.Search(
"SELECT*FORMUSER");
}
复制代码

得到结果也是一样的。

8)现在我想通过一个用户类来控制操作权限,比如增删改的权限,创建一个用户类:

复制代码
///<summary>///IdIdentityInterface
///</summary>publicinterfaceIdentity
{
intId{get;set;}
}
publicclassUser:Identity
{
publicintId{get;set;}
publicstringName{get;set;}
}
复制代码

修改DatabaseManager.cs代码:

复制代码
publicclassDatabaseManager
{
IDatabase_database;
User_user;
publicDatabaseManager(IDatabasedatabase):this(database,null)
{
}
publicDatabaseManager(IDatabasedatabase,Useruser)
{
_database
=database;
_user
=user;
}
///<summary>///CheckAuthority
///</summary>///<returns></returns>publicboolIsAuthority()
{
boolresult=_user!=null&&_user.Id==1&&_user.Name=="leepy"?true:false;
if(!result)
Console.WriteLine(
"Notauthority!");
returnresult;
}
publicvoidSearch(stringcommandText)
{
_database.Select(commandText);
}
publicvoidAdd(stringcommandText)
{
if(IsAuthority())
_database.Insert(commandText);
}
publicvoidSave(stringcommandText)
{
if(IsAuthority())
_database.Update(commandText);
}
publicvoidRemove(stringcommandText)
{
if(IsAuthority())
_database.Delete(commandText);
}
}
复制代码

在构造函数中增加了一个参数User,而Add,Save,Remove增加了权限判断。

修改客户端程序:

复制代码
Useruser=newUser{Id=1,Name="leepy"};
varbuilder
=newContainerBuilder();
builder.RegisterModule(
newConfigurationSettingsReader("autofac"));
builder.RegisterInstance(user).As
<User>();
builder.Register(c
=>newDatabaseManager(c.Resolve<IDatabase>(),c.Resolve<User>()));
using(varcontainer=builder.Build())
{
varmanager
=container.Resolve<DatabaseManager>();
manager.Add(
"INSERTINTOUSER...");
}
复制代码

运行结果:

image
分析:

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" };

运行结果:

image

说明该用户无权限操作。

源代码下载:AutofacDemo.rar

免责声明:文章转载自《依赖注入框架Autofac的简单使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇easyui textarea回车导致datagrid 数据无法展示的问题Android Application Framework FAQ下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NopCommerce架构分析之一----依赖类生成容器

NopCommerce为了实现松耦合的框架设计目的,使用了IOC框架:Autofac。据有人测试,Autofac是性能好的IOC工具。 1、在IOC中,组件首先需要在IOC中注册,有通过配置文件注册的,像Spring.net,也有通过特性注册的,像StructureMap,也有通过代理来注册的,像Autofac。但是IOC讲究一个原则,就是接口和实现分离。...

最新.NET Core面试题汇总

这几天给.neter们整理了26道.NET Core面试题,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏! 对于还没有学习.NET Core,或正在学习,也可以对照一下自己,掌握的熟练程度! 1.如何在controller中注入service? 在config ser...

第6章 高级字符驱动操作

一、ioctl接口 函数原型: int ioctl(int fd, unsigned long cmd, ...); ioctl驱动方法有和用户空间版本不同的原型: int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); 为帮助程序...

ioctl() 参数

在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域:     bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。      bit29~bit15 14位为 "数据大小"...

TinyFrame升级之十:WCF Rest Service注入IOC的心

由于在实际开发中,Silverlight需要调用WebService完成数据的获取,由于之前我们一直采用古老的ASMX方式,生成的代理类不仅难以维护,而且自身没有提供APM模式的调用方式,导致在Sinverlight中实现线程同步,非常的困难。所以这里我采用了WCF Restful Service来完成。 这里我们需要新建一个WCF Rest Servic...

SpringBoot入门篇

一    什么是springboot Spring官网:http://spring.io/projects SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: Springboot不是什么真正意义上的新框架,就像maven整合了所有的jar包,spring boot整合了所有常...