原文: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>
/// 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 IoC容器基本实战【2】的更多相关文章

  1. Autofac IoC容器基本使用步骤【1】

    原文:http://www.bkjia.com/Asp_Netjc/888119.html  [原文中有一个地方报错,下面已修改] 一.基本步骤: 1.设计适合控制反转(IoC)的应用程序 2.给应用 ...

  2. IoC容器Autofac学习笔记

    一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...

  3. IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用

    Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...

  4. Ioc容器Autofac系列(1)-- 初窥

     一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...

  5. AutoFac使用~IOC容器(DIP,IOC,DI)

    #cnblogs_post_body h1 { background-color: #A5A5A5; color: white; padding: 5px } Autofac一款IOC容器,据说比Sp ...

  6. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  7. IOC容器 - Autofac概述

    Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...

  8. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...

  9. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

随机推荐

  1. UVA 10620 - A Flea on a Chessboard(鸽笼原理)

    UVA 10620 - A Flea on a Chessboard 题目链接 题意:给定一个跳蚤位置和移动方向.如今在一个国际象棋棋盘上,左下角为黑格,一个格子为s*s,推断是否能移动到白格子.问要 ...

  2. linux内核——PAE(物理地址扩展)

    引入PAE机制后,分页模式是怎样的呢? 首先,要搞明白几件事,2.6.11以上版本的linux内核中,存在4中页表(页全局目录,页上级目录,页中级目录,页表),这些页表结构是已经存在于硬盘中的,当进程 ...

  3. Windows 开发之VC++垃圾清理程序软件

    概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...

  4. hibernate+spring mvc, 解决hibernate 对象懒加载 json序列化问题

    引用地址 在使用Spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") ...

  5. Android设计模式系列(2)--SDK源码之观察者模式

    观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...

  6. 使用maven创建一个例子

    创建一个目录:D:\testmaven 在命令行中切换到D:\testmaven目录后输入: mvn archetype:generate 下载骨架,它会往本地工厂存信息 也可以直接使用带有参数的命令 ...

  7. Content Editor Webpart(一)引用JQuery

    SharePoint里面自带了一个Content Editor Webpart, 使用这个webpart.能够方便的往页面上加入随意的内容(HTML,css, JS).以此来达到往页面加入自己定义内容 ...

  8. Java Persistence with MyBatis 小结2

    MyBatis 最关键的组成部分是 SqlSessionFactory,我们可以从中获取 SqlSession,并执行映射的 SQL 语句.SqlSessionFactory 对象可以通过基于 XML ...

  9. unity, AnimatorCullingMode的一个bug

    我在一个fbx节点上添加了一个Animator,CullingMode设置为Cull Update Transforms(即如果没有激活的SkinnedRenderer就不更新骨骼动画),然后我将这个 ...

  10. FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言

    FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言 2014年08月08日 14:08    看门狗 关键词: FPGA 作者:friends 从大学时代第一次接触FPGA至今已有10多 ...