欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析依赖注入框架Autofac的使用

程序员文章站 2023-11-16 23:24:58
下面通过代码给大家分享下依赖注入框架autofac的使用,具体如下所示:  autofac是一款ioc框架,比较于其他的ioc框架,如spring.net,un...

下面通过代码给大家分享下依赖注入框架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");
}

运行结果:

浅析依赖注入框架Autofac的使用

分析:

这里通过containerbuilder方法registertype对databasemanager进行注册,当注册的类型在相应得到的容器中可以resolve你的databasemanager实例。

复制代码 代码如下:

builder.registertype<sqldatabase>().as<idatabase>();

通过as可以让databasemanager类中通过构造函数依赖注入类型相应的接口。

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

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

复制代码 代码如下:

builder.registertype<oracledatabase>().as<idatabase>();

运行结果:

浅析依赖注入框架Autofac的使用

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

运行结果:

浅析依赖注入框架Autofac的使用

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

运行结果:

浅析依赖注入框架Autofac的使用

分析:

复制代码 代码如下:

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的使用

说明该用户无权限操作。

以上就是本文的全部内容,希望大家喜欢。