依据于注入

记录一点一滴知识,为了越来越好的劳务后来者!

生机勃勃、为何使用AutoFac?

前面介绍了Unity和Ninject三个IOC容器,不过发掘园子里用AutoFac的雷同更为布满,于是捯饬了二日,开掘这几个东东真正是个高大上的IOC容器~

Autofac是.NET领域最棒盛行的IOC框架之大器晚成,故事是速度最快的叁个:

优点: 

  • 它是C#语言沟通很严密,也正是说C#里的许多编制程序格局都可以为Autofac使用,比如能够用Lambda表达式注册组件
  • 好低的求学曲线,学习它丰盛的简便,只要您掌握了IoC和DI的概念以至在何时供给选用它们
  • XML配置支持
  • 电动装配
  • 与Asp.Net MVC 3集成
  • 微软的Orchad开源程序选择的正是Autofac,从该源码可以见见它的方便和强有力

既然它都那样牛X了,大家用它就自然了,所以推举其为IOC的顶峰实施方案!

二、AutoFac的使用

第意气风发你必需获得AutoFac,这里您可以因而各样方法加载它,小编这里还是通过VS中的NuGet来加载AutoFac,无论是哪一类办法,最后的指标正是将
Autofac.dll,Autofac.Configuration.dll
这个程序集援引到您的类型中。那样在您的门类中,借使想使用AutoFac,只需加多其取名空间引用就能够~

1、AutoFac入门

我们先定义一个数额访谈的接口:

public interface IDAL
{
    void Insert(string commandText);
}

然后用Sql和Oracle三种方法分别实现上述接口,但是这里只是演示而已,所以并从未真的去完毕那三个类,你懂的~

SQL方式:

图片 1

public class SqlDAL : IDAL
{
    public void Insert(string commandText)
    {
        Console.WriteLine("使用sqlDAL添加相关信息");
    }
}

图片 2

Oracle方式:

图片 3

public class OracleDAL : IDAL
{
    public void Insert(string commandText)
    {
        Console.WriteLine("使用OracleDAL添加相关信息");
    }
}

图片 4

下一场注入完毕构造函数注入:

图片 5

public class DBManager 
{ 
    IDAL _dal;
    public DBManager(IDAL dal) 
    { 
        _dal= dal;
    }
public void Add(string commandText) 
    { 
        _dal.Insert(commandText); 
    }
}

图片 6

最后要实在成功信任注入就得AtuoFac上场了:

图片 7

var builder = new ContainerBuilder(); 
builder.RegisterType<DBManager>(); 
builder.RegisterType<SqlDAL>().As<IDAL>(); 
using (var container = builder.Build()) 
{ 
    var manager = container.Resolve<DBManager>(); 
    manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')"); 
}

图片 8

从以上栗子能够观望,其实AutoFac的应用跟Unity的应用有一点点像,关键的东东就是其生机勃勃Container容器类

2、AutoFac常用艺术求证

(1)builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。比方上面正是注册接口IDAL的实例SqlDAL

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<SqlDAL>().As<IDAL>();
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>();

(2卡塔尔国IContainer.Resolve<IDAL>():拆解深入分析有些接口的实例。比方地点的最终大器晚成行代码便是解析IDAL的实例SqlDAL

(3)builder.RegisterType<Object>().Named<Iobject>(string name):为三个接口注册差别的实例。不经常候难免会境遇八个类映射同一个接口,举例SqlDAL和OracleDAL都达成了IDAL接口,为了准确获取想要的类别,就务须在注册时起名字。

builder.RegisterType<SqlDAL>().Named<IDAL>("sql");
builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");
OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle");

(4卡塔尔IContainer.ResolveNamed<IDAL>(string name):分析有些接口的“命名实例”。比如地方的尾声生龙活虎行代码就是深入分析IDAL的命名实例OracleDAL

(5)builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的点子为一个接口注册不一致的实例。不经常候大家会将某二个接口的例外完结用枚举来分别,并不是字符串,举个例子:

public enum DBType{ Sql, Oracle}

builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);
builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.ResolveKeyed<IDAL>(DBType.Sql);
OracleDAL oracleDAL = (OracleDAL)container.ResolveKeyed<IDAL>(DBType.Oracle);

(6卡塔尔IContainer.ResolveKeyed<IDAL>(Enum enum):遵照枚举值深入解析有些接口的特定实例。例如地点的末梢风姿洒脱行代码就是剖析IDAL的特定实例OracleDAL

(7卡塔 尔(阿拉伯语:قطر‎builder.RegisterType<Worker>().InstancePerDependency():用于调控指标的生命周期,每一次加载实例时都以新建一个实例,暗许正是这种艺术

(8卡塔尔国builder.RegisterType<Worker>().SingleInstance():用于调节目的的生命周期,每趟加载实例时都以回来同一个实例

(9卡塔尔国IContainer.Resolve<T>(NamedParameter namedParameter):在拆解剖判实例T时给其赋值

DBManager manager = container.Resolve<DBManager>(new NamedParameter("name", "SQL"));

图片 9

public class DBManager 
{   
    IDAL dal;
    public DBManager (string name,IDAL  _dal)
    {
        Name = name;
        dal= _dal;
    }
}

图片 10

3、通过安排的艺术使用AutoFac

(1卡塔 尔(阿拉伯语:قطر‎先配备好布局文件

图片 11

<?xml version="1.0"?>
  <configuration>
    <configSections>
      <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
    </configSections>
    <autofac defaultAssembly="ConsoleApplication1">
      <components>
        <component type="ConsoleApplication1.SqlDAL, ConsoleApplication1" service="ConsoleApplication1.IDAL" />
      </components>
    </autofac>
  </configuration>

图片 12

(2卡塔 尔(英语:State of Qatar)读取配置实现依据注入(注意引进Autofac.Configuration.dll卡塔 尔(阿拉伯语:قطر‎

图片 13

static void Main(string[] args)
    {
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterType<DBManager>();
        builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
        using (IContainer container = builder.Build())
        {
            DBManager manager = container.Resolve<DBManager>();
            manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')"); 
    } 

图片 14

三、ASP.NET MVC与AtuoFac

好不轻巧到了ASP.NET MVC与AtuoFac双剑合璧的时候了,下边就看看AtuoFac在MVC中的应用,其实非常轻易,差不离就多少个步骤消除:

1、首先在函数Application_Start() 注册自身的调整器类,必必要引进Autofac.Integration.Mvc.dll

图片 15

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Autofac;
using AtuoFacOfMVC4.Models;
using System.Reflection;
using Autofac.Integration.Mvc;


namespace AtuoFacOfMVC4
{
   public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            var builder = new ContainerBuilder();
            SetupResolveRules(builder);
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
        private void SetupResolveRules(ContainerBuilder builder)
        {
            builder.RegisterType<StudentRepository>().As<IStudentRepository>();
        }
    }
}

图片 16

2、以往在您的MVC程序中注入信赖代码就ok了

(1卡塔尔国首先声澳优个Student学子类

图片 17

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AtuoFacOfMVC4.Models
{
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Graduation { get; set; }
        public string School { get; set; }
        public string Major { get; set; }
    }
}

图片 18

(2卡塔尔国然后证明仓储接口及其达成

图片 19

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AtuoFacOfMVC4.Models
{
    public interface IStudentRepository
    {
        IEnumerable<Student> GetAll();
        Student Get(int id);
        Student Add(Student item);
        bool Update(Student item);
        bool Delete(int id);
    }
}

图片 20

图片 21 View Code

(3卡塔 尔(阿拉伯语:قطر‎最终增多调控器StudentController,并流入信任代码

图片 22

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AtuoFacOfMVC4.Models;

namespace AtuoFacOfMVC4.Controllers
{
    public class StudentController : Controller
    {
        readonly IStudentRepository repository;
        //构造器注入
        public StudentController(IStudentRepository repository)
        {
            this.repository = repository;
        }

        public ActionResult Index()
        {
            var data = repository.GetAll();
            return View(data);
        }

    }
}

图片 23

(4卡塔尔国最终为控制器StudentController的Index方法增添视图就能够,这里不再详述,运转效果如下

图片 24

 

小编介绍:半路学IT,做开拓3年,先下车在一家分享单车集团,做后台开采!

 

 小编开了三个公众号,款待各位有同气相求朋友,关怀!不定时分享职业,和作者得逸事!

 

图片 25

*将协和读书的一定量记录并分享出去,不仅可以使和谐获得成长,不经常也能扶持一下外人,何乐而不为呢?借使这篇作品对你还会有一些用的话,希望扶植引荐一下~

相关文章