热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

Autofac是一款IOC框架,比起Spring.NET,Unity,Castle等等框架,它很轻量级且性能也很高,下面小编给大家介绍下依赖注入框架Autofac的使用。

下面通过代码给大家分享下依赖注入框架Autofac的使用,具体如下所示:

 Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的。

1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,这也是本篇文章重点使用的Autofac的类库。

2)创建一个控制台工程,并且引用以上的DLL文件。创建一个数据库操作接口IDatabase.cs:

/// 
/// Database operate interface
/// 
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();
builder.RegisterType().As();
using (var cOntainer= builder.Build())
{
    var manager = container.Resolve();
    manager.Search("SELECT * FORM USER");
}

运行结果:

image

分析:

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

代码如下:

builder.RegisterType().As();

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

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

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

代码如下:

builder.RegisterType().As();

运行结果:

image

6)显然以上的程序中,SqlDatabase或者OracleDatabase已经暴露于客户程序中了,现在我想将该类型选择通过文件配置进行读取。

Autofac自带了一个Autofac.Configuration.dll 非常方便地对类型进行配置,避免了程序的重新编译。

修改App.config:


代码如下:


 
   

 
 
   
     
   

 


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

对应的客户端程序改为:

代码如下:

var builder = new ContainerBuilder();
builder.RegisterType();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
using (var cOntainer= builder.Build())
{
    var manager = container.Resolve();
    manager.Search("SELECT * FORM USER");
}

运行结果:

image

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

var builder = new ContainerBuilder();
//builder.RegisterType();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
builder.Register(c => new DatabaseManager(c.Resolve()));
using (var cOntainer= builder.Build())
{
  var manager = container.Resolve();
  manager.Search("SELECT * FORM USER");
}

 得到结果也是一样的。

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

///  
/// Id Identity Interface 
///  
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; 
  }
  ///  
  /// Check Authority 
  ///  
  ///  
  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(); 
builder.Register(c => new DatabaseManager(c.Resolve(), c.Resolve()));
using (var cOntainer= builder.Build()) 
{ 
  var manager = container.Resolve();
  manager.Add("INSERT INTO USER ..."); 
}

运行结果:

image

分析:

代码如下:

builder.RegisterInstance(user).As();注册User实例。
builder.Register(c => new DatabaseManager(c.Resolve(), c.Resolve()));通过Lampda表达式注册

DatabaseManager实例。

如果这里我修改User的属性值:

代码如下:

User user = new User { Id = 2, Name = "zhangsan" };

运行结果:

image

说明该用户无权限操作。

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


推荐阅读
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
author-avatar
lhpa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有