.NET 使用Autofac实现依赖注入

前端之家收集整理的这篇文章主要介绍了.NET 使用Autofac实现依赖注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html

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(voidUpdate(voidDelete(stringcommandText);
}

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

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

classsqlDatabase:IDatabase
{
stringName
{
get{return"sqlserver";}
}

stringcommandText)
{
Console.WriteLine(
string.Format('{0}'isaquerysqlin{1}!",commandText,Name));
}

'{0}'isainsertsqlin{1}!'{0}'isaupdatesqlin{1}!'{0}'isadeletesqlin{1}! }
}
以及

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

classDatabaseManager
{
IDatabase_database;

publicDatabaseManager(IDatabasedatabase)
{
_database
=database;
}

voidSearch(stringcommandText)
{
_database.Select(commandText);
}

voidAdd(stringcommandText)
{
_database.Insert(commandText);
}

voidSave(stringcommandText)
{
_database.Update(commandText);
}

voidRemove(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");
}
运行结果:

分析:

这里通过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>
configSectionssectionname="autofac"type="Autofac.Configuration.SectionHandler,Autofac.Configuration"/>
</autofacdefaultAssembly="AutofacDemo"componentscomponent="AutofacDemo.SqlDatabase,AutofacDemo"service="AutofacDemo.IDatabase"autofac>
通过Autofac.Configuration.SectionHandler配置节点对组件进行处理。

对应的客户端程序改为:

newContainerBuilder();
builder.RegisterType
<DatabaseManager>();
builder.RegisterModule(
newConfigurationSettingsReader(autofac"));

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

newContainerBuilder();
//builder.RegisterType<DatabaseManager>();
builder.RegisterModule("));
builder.Register(c
=>newDatabaseManager(c.Resolve<IDatabase>()));
得到结果也是一样的。

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

IdIdentityInterface
</summary>interfaceIdentity
{
intId{get;set;}
}


classUser:Identity
{
set;}
set;}
}
修改DatabaseManager.cs代码:

classDatabaseManager
{
IDatabase_database;
User_user;

publicDatabaseManager(IDatabasedatabase):this(database,null)
{
}

publicDatabaseManager(IDatabasedatabase,Useruser)
{
_database
=database;
_user
=user;
}

CheckAuthority
<returns></returns>
boolIsAuthority()
{
boolresult=_user!=null&&_user.Id==1&&_user.Name==leepy"?true:false;
if(!result)
Console.WriteLine(
Notauthority!");

returnresult;
}

stringcommandText)
{
if(IsAuthority())
_database.Insert(commandText);
}

if(IsAuthority())
_database.Update(commandText);
}

if(IsAuthority())
_database.Delete(commandText);
}
}

猜你在找的设计模式相关文章