只为成功找方向,不为失败找借口

每天都不能停止前进的脚步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Autofac应用总结

Posted on 2017-12-06 13:30  冰碟  阅读(395)  评论(0编辑  收藏  举报

准备:

    public interface IDAL
    {
        void Insert(string commandText);
    }
    public class SqlDAL : IDAL
    {
        public void Insert(string commandText)
        {
            Console.WriteLine("使用sqlDAL添加相关信息");
        }
    }
    public class OracleDAL : IDAL
    {
        public void Insert(string commandText)
        {
            Console.WriteLine("使用OracleDAL添加相关信息");
        }
    }
    public class DBManager
    {
        IDAL _dal;
        private string Name;
        public DBManager(IDAL dal)
        {
            _dal = dal;
        }
        public DBManager(string name, IDAL _dal)
        {
            Name = name;
            this._dal = _dal;
        }
        public void Add(string commandText)
        {
            _dal.Insert($"Name-{Name}:{commandText}");
        }
    }

  

2,应用

 var builder = new ContainerBuilder();
       //注册类型 builder.RegisterType<DBManager>();
       //注册类型及其实例 builder.RegisterType<SqlDAL>().As<IDAL>(); //命名注册 builder.RegisterType<SqlDAL>().Named<IDAL>("sql"); builder.RegisterType<OracleDAL>().Named<IDAL>("oracle"); using (var container = builder.Build()) { var manager = container.Resolve<DBManager>(); manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')"); SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql"); OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle"); //在解析实例时给其赋值 var manager1 = container.Resolve<DBManager>(new NamedParameter("name", "SQL")); manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')"); }

  常用方法:

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时给其赋值

 

3,Asp.net MVC中应用

引入Autofac.Integration.Mvc.dll

var builder = new ContainerBuilder();
            builder.RegisterType<SqlDAL>().As<IDAL>();
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

  Controller中应用

        private IDAL iDal;
        public HomeController(IDAL iDal)
        {
            this.iDal = iDal;
        }