浅析依赖注入框架Autofac的使用
下面通过代码给大家分享下依赖注入框架autofac的使用,具体如下所示:
autofac是一款ioc框架,比较于其他的ioc框架,如spring.net,unity,castle等等所包含的,它很轻量级性能上也是很高的。
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 == 1 && _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 = 1, 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" };
运行结果:
说明该用户无权限操作。
以上就是本文的全部内容,希望大家喜欢。
推荐阅读
-
浅析依赖注入框架Autofac的使用
-
ABP框架的基础配置及依赖注入讲解
-
浅析依赖注入框架Autofac的使用
-
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之七使用JWT生成Token(个人见解)
-
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之十一Swagger使用一
-
C#控制台程序中使用官方依赖注入的实现
-
AngularJS的依赖注入实例分析(使用module和injector)
-
ASP.NET Core 2.2 WebApi 系列【三】AutoFac 仓储接口的依赖注入
-
浅析PHP类的反射来实现依赖注入过程
-
基于.net EF6 MVC5+WEB Api 的Web系统框架总结(3)-项目依赖注入