原文地址: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:
DatabaSEOperateinterface
</summary>
publicinterfaceIDatabase
{
stringName{get;}
voidSelect(stringcommandText);
voidInsert(voidUpdate(voidDelete(stringcommandText);
}
这里包含CRUD四种操作的方法。
3)创建两种数据库的操作类,sqlDatabase.cs以及OracleDatabase.cs:
{
stringName
{
get{return"sqlserver";}
}
stringcommandText)
{
Console.WriteLine(string.Format('{0}'isaquerysqlin{1}!",commandText,Name));
}
'{0}'isainsertsqlin{1}!'{0}'isaupdatesqlin{1}!'{0}'isadeletesqlin{1}! }
}
{
oracle
4)接着创建一个数据库管理器DatabaseManager.cs:
{
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);
}
}
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>();
修改App.config:
configSectionssectionname="autofac"type="Autofac.Configuration.SectionHandler,Autofac.Configuration"/>
</autofacdefaultAssembly="AutofacDemo"componentscomponent="AutofacDemo.SqlDatabase,AutofacDemo"service="AutofacDemo.IDatabase"autofac>
对应的客户端程序改为:
builder.RegisterType<DatabaseManager>();
builder.RegisterModule(newConfigurationSettingsReader(autofac"));
7)另外还有一种方式,通过Register方法进行注册:
//builder.RegisterType<DatabaseManager>();
builder.RegisterModule("));
builder.Register(c=>newDatabaseManager(c.Resolve<IDatabase>()));
得到结果也是一样的。
8)现在我想通过一个用户类来控制操作权限,比如增删改的权限,创建一个用户类:
</summary>interfaceIdentity
{
intId{get;set;}
}
classUser:Identity
{
set;}
set;}
}
{
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);
}
}
修改客户端程序:
varbuilder=newContainerBuilder();
builder.RegisterModule("));
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...
分析:
builder.RegisterInstance(user).As<User>();注册User实例。
builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>(),c.Resolve<User>()));通过Lampda表达式注册DatabaseManager实例。
User user = new User { Id = 2,Name = "zhangsan" };
源代码下载:AutofacDemo.rar
原文链接:https://www.f2er.com/javaschema/285501.html