Autofac的简单使用

有关依赖注入的原理这里就不说了,依赖注入的框架比较多,比如:Castle、Unity、Ninject、Autofac、StructureMap、Spring.Net等。最近在项目中使用了Autofac,借此机会进行一些总结,也顺便跟大家讨论一下。Autofac主要用了Autofac.dll,AutoMapper.dll。

举个简单的例子,有一个应用用的数据库是Sql Server,将来不排除要使用Oracle或者是其它数据库。那么我们在开发的时候就要考虑了,将来要换数据库的时候是不是要重新开发?一般我们的做法是,将跟数据库交互的放在接口里,然后用Sql Server、Oracle的相关类去实现该接口,在程序初始化的时候根据数据库去实例化相应的接口。直接贴上代码:

IDatabase接口

public interface IDatabase
    {
        string Name { get; }

        void Select(string commandText);

        void Insert(string commandText);

        void Update(string commandText);

        void Delete(string commandText);
    }

SqlDatabase类

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

OracleDatabase类

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

在这里,还新增了DataBase的管理类,避免客户端直接操作IDatabase的实现类。

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

下面,我们来看Autofac的使用:

var builder = new ContainerBuilder();
            builder.RegisterType<DatabaseManager>();
            //builder.RegisterType<SqlDatabase>().As<IDatabase>();
            builder.RegisterType<OracleDatabase>().As<IDatabase>();
            using (var container = builder.Build())
            {
                var manager = container.Resolve<DatabaseManager>();
                manager.Search("SELECT * FORM USER");
            }

如果要用Sql Server数据库,则将builder.RegisterType<OracleDatabase>().As<IDatabase>()改为builder.RegisterType<SqlDatabase>().As<IDatabase>()即可,其它都不变。

不过,有人会问,我直接new一个对象不是更简单么?确实,如果只有一个实现类,用new可能会更简单。但是,一个应用通常会有很多的实现类,如果都用new的话,无疑增加了维护的困难。

我不修改代码可以吗?答案是可以的。你可以通过配置文件来配置,下面增加一个配置:

<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>

客户端实现的代码如下:

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的简单使用。一个应用会有成千上万个实现类,如果每次使用时都是先注册再获取实现类的话,那用依赖注入就没多大意义了。其实,我们可以做一个公共组件,在程序初始化的时候注册,需要用的时候再获取出来,这样就很方便了。

程序初始化时调用EngineContext.Initialize(false)即可,接下来就可以直接像EngineContext.Current.Resolve<IDatabase>()这样使用了。

http://files.cnblogs.com/files/dengwenbo/AutofacInfrastructure.rar

时间: 2024-08-04 20:58:48

Autofac的简单使用的相关文章

[转]依赖注入框架Autofac的简单使用

Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://code.google.com/p/autofac/downloads/list 1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,这也是本篇文章重点使用的Autofac的类库. 2)创建一个控制台工程,并且引用以上的DLL文件.创建一个数据库操作接

依赖注入框架Autofac的简单使用

Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://code.google.com/p/autofac/downloads/list 1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,这也是本篇文章重点使用的Autofac的类库. 2)创建一个控制台工程,并且引用以上的DLL文件.创建一个数据库操作接

记录对依赖注入的小小理解和autofac的简单封装

首先,我不是一个开发者,只是业余学习者.其次我的文化水平很低,写这个主要是记录一下当前对于这块的理解,因为对于一个低水平 的业余学习者来说,忘记是很平常的事,因为接触.应用的少,现在理解,可能过段时间就会忘了,自己记录下来应该可以少走些弯路,以免从头再来查找资料. 另外,如果我的记录能帮忙到一些朋友的话,也难免会有些小满足的.学习的门槛除了理解能力,绝大部分来自于英文水平和专业术语,我希望的是我能用比较通俗易懂的表达,获得大家的理解,更希望大牛们是如是做的,所以写这个更希望的是能得到大牛的帮助.

依赖注入容器Autofac的详解[转]

依赖注入容器Autofac的详解 发表于 2011 年 09 月 22 日 由 renfengbin 分享到:GMAIL邮箱         Hotmail邮箱 delicious digg Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Autofac支持自动装配,给定的组件类型Autofac自动选择使用构造函数注入或者属性注入,Autofac还可以

依赖注入容器Autofac的详解

Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Autofac支持自动装配,给定的组件类型Autofac自动选择使用构造函数注入或者属性注入,Autofac还可以基于lambda表达式创建实例,这使得容器非常灵活,很容易和其他的组件集成.2,资源管理的可视性:基于依赖注入容器构建的应用程序的动态性,意味着什么时候应该处理那些资源有点困难.Autofac

【AutoFac】依赖注入和控制反转的使用

在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个时候我们不是一个创建者,我们是以一个请求者的身份去请求容器给我们这个对象实例.我们所有的对象依赖于容器提供给你的资源,控制权落到了容器身上.在这里的身份转化或许就是控制反转的核心吧. 依赖注入:我们向容器发出请求以后,获得这个对象实例的过程就叫依赖注入.也就是我们在使用对向前我们都需要先

依赖注入之AutoFac

一 .IoC框架AutoFac简介 IoC即控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫"依赖查找"(Dependency Lookup).通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它.也可以说,依赖被注入到对象中. 控制反转背后的核心思想是, 我们不再将类

NopCommerce架构分析(转载)

原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCommerce架构分析之参考资料 参考:DependencyResolver http://www.cnblogs.com/RobbinHan/archive/2011/11/30/2269537.html 依赖注入框架Autofac的简单使用 http://www.cnblogs.com/lipin

NopCommerce架构分析之参考资料

http://www.cnblogs.com/RobbinHan/archive/2011/11/30/2269537.html 依赖注入框架Autofac的简单使用 http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html ModelBinder——ASP.NET MVC Model绑定的核心 http://www.cnblogs.com/artech/archive/2012/05/21/model-binde