• Autofac应用总结


    准备:

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

      

  • 相关阅读:
    求Mac 的adt插件!
    前端ajax异步传值以及后端接收参数的几种方式
    在eclipse中使用git clone 别人共享在Github的代码和上传到自己的仓库!
    Tomcat 配置虚拟路径保存、访问图片
    sssp-springmvc+spring+spring-data-jpa问题总结
    redis整合异常总结
    sssp-springmvc+spring+spring-data-jpa增删改查
    ssm+PageHelper实现分页查询
    微信小程序异常解析
    CentOS 7.4中firewall防火墙详解和配置以及切换为iptables防火墙
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/7992241.html
Copyright © 2020-2023  润新知