AutoFac基本使用

  1. IOC(控制反转) + DI(依赖注入)
  2. 面向接口编程
  3. Unity、AutoFac、Spring.Net、Castie等

基础功能示例:

class Dog
    {
        public void Voice()
        {
            Console.WriteLine("Dog Wang.wang");
        }
        public void Run()
        {
            Console.WriteLine("Dog Running");
        }

    }
    class Cat
    {
        public void Voice()
        {
            Console.WriteLine("Cat Miao.Miao");
        }
        public void Run()
        {
            Console.WriteLine("Cat Running Find Mouse");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            new Dog().Run();
            new Cat().Voice();
            Console.Read();
        }
    }

转换为面向对象(多态):

interface IAnimal
    {
        void Voice();
        void Run();
    }


    class Dog : IAnimal
    {
        public void Voice()
        {
            Console.WriteLine("Dog Wang.wang");
        }
        public void Run()
        {
            Console.WriteLine("Dog Running");
        }

    }
    class Cat : IAnimal
    {
        public void Voice()
        {
            Console.WriteLine("Cat Miao.Miao");
        }
        public void Run()
        {
            Console.WriteLine("Cat Running Find Mouse");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            IAnimal animald = new Dog();
            IAnimal animalc = new Cat();
            animald.Voice();
            animalc.Run();
            Console.Read();
        }   
    }

开发中应当将功能进行一致的抽象。

例如 :登录模块。按行为来分配接口(注册,登录,验证,返回Token,密码找回),然后分别实现每个接口

主页加载数据模块有:导航栏(nav bar)/主页(Body)/底部信息(Foot)

 登录接口

 interface ILogin
    {
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="user"></param>
        void Registere(User user, string password2);
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="user"></param>
        void Login(User user);
        /// <summary>
        ///  登录
        /// </summary>
        /// <param name="user"></param>
        bool LoginCheck(User user);
        /// <summary>
        /// 密码找回
        /// </summary>
        /// <param name="Email"></param>
        void FindPassword(string Email);
    }

 interface IMain
    {
        /// <summary>
        /// 加载导航栏
        /// </summary>
        /// <returns></returns>
        string LoadNavBar();
        /// <summary>
        /// 加载头部
        /// </summary>
        /// <returns></returns>
        string LoadBody();
        /// <summary>
        /// 加载底部信息
        /// </summary>
        /// <returns></returns>
        string LoadFoot();
    }

实现:

public class User
    {
        public string UserID { get; set; }
        public string Password { get; set; }
        public DateTime CreateTime { get; set; }       
        public string Email { get; set; }

    }
 public class ImpentLogin : ILogin
    {
        public void FindPassword(string Email)
        {
            Console.WriteLine($"已发送验证码{System.Guid.NewGuid()}到邮箱{Email},请完成后续验证");
        }

        public void Login(User user)
        {
            if (LoginCheck(user))
            {
                Console.WriteLine("登录成功。正在转到主页");
            }
            else
            {
                Console.WriteLine("用户名/密码错误,请重新登录");
            }
        }

        public bool LoginCheck(User user)
        {
            if (user.UserID=="Admin")
            {
                return true;
            }
            return false;
        }

        public void Registere(User user,string password2)
        {
            if (user.Password==password2)
            {
                Console.WriteLine($"恭喜{user.UserID}注册成功");
            }
            else
            {
                Console.WriteLine("两次密码不一致,请重新输入");
            }
            
        }
    }
 public class Main : IMain
    {
        public string LoadBody()
        {
            return "Content";
        }

        public string LoadFoot()
        {
            return "foot";
        }

        public string LoadNavBar()
        {
            return "NavBar";
        }
    }

AutoFac基本使用一对一:

install-package autofac -version 5.2

class Program
    {
        static void Main(string[] args)
        {
            ContainerBuilder cb = new ContainerBuilder();  //创建容器
            cb.RegisterType<ImpentLogin>().As<ILogin>();   //依赖注入
            cb.RegisterType<Main>().As<IMain>();

            IContainer ioc = cb.Build();                   //构建
            ImpentLogin login = ioc.Resolve<ImpentLogin>(); //控制反转
            IMain main = ioc.Resolve<IMain>(); 

            var user = new User() { UserID = "Admin", Password = "123456" };

            login.Login(user); //登录

            Console.WriteLine($"内容:{ main.LoadBody()}");
            Console.WriteLine($"导航:{ main.LoadNavBar()}");
            Console.WriteLine($"底部:{ main.LoadFoot()}");  
        }
    }

增加:管理员账户可以看到额外信息

 public  interface IManageMain
    {
        string GetManageInfo();
        string EditUser();
    }
 public class Main : IMain, IManageMain
    {
        public string EditUser()
        {
            return "IManageMain EditUser";
        }

        public string GetManageInfo()
        {
            return "IManageMain Get INFO";
        }

        public string LoadBody()
        {
            return "Content";
        }

        public string LoadFoot()
        {
            return "foot";
        }

        public string LoadNavBar()
        {
            return "NavBar";
        }
    }
 static void Main(string[] args)
        {
            /*
            ContainerBuilder cb = new ContainerBuilder();  //创建容器
            cb.RegisterType<ImpentLogin>().As<ILogin>();   //依赖注入
            cb.RegisterType<Main>().As<IMain>();

            IContainer ioc = cb.Build();                   //构建
            ImpentLogin login = ioc.Resolve<ImpentLogin>(); //控制反转
            IMain main = ioc.Resolve<IMain>(); 

            var user = new User() { UserID = "Admin", Password = "123456" };

            login.Login(user); //登录

            Console.WriteLine($"内容:{ main.LoadBody()}");
            Console.WriteLine($"导航:{ main.LoadNavBar()}");
            Console.WriteLine($"底部:{ main.LoadFoot()}"); 
            */
            ContainerBuilder cb = new ContainerBuilder();
            cb.RegisterType<Main>().AsImplementedInterfaces();//注册当前类实现的所有接口

            IContainer ioc = cb.Build();

            IMain login = ioc.Resolve<IMain>();               //主页
            IManageMain manage = ioc.Resolve<IManageMain>();  //管理员

            Console.WriteLine(login.LoadBody());
            Console.WriteLine(manage.EditUser());
            Console.Read();
             
        }

注册程序集下的所有接口

 class Program
    {
        static void Main(string[] args)
        {
            /*
            ContainerBuilder cb = new ContainerBuilder();  //创建容器
            cb.RegisterType<ImpentLogin>().As<ILogin>();   //依赖注入
            cb.RegisterType<Main>().As<IMain>();

            IContainer ioc = cb.Build();                   //构建
            ImpentLogin login = ioc.Resolve<ImpentLogin>(); //控制反转
            IMain main = ioc.Resolve<IMain>(); 

            var user = new User() { UserID = "Admin", Password = "123456" };

            login.Login(user); //登录

            Console.WriteLine($"内容:{ main.LoadBody()}");
            Console.WriteLine($"导航:{ main.LoadNavBar()}");
            Console.WriteLine($"底部:{ main.LoadFoot()}"); 
            
            ContainerBuilder cb = new ContainerBuilder();
            cb.RegisterType<Main>().AsImplementedInterfaces();//注册当前类实现的所有接口

            IContainer ioc = cb.Build();

            IMain login = ioc.Resolve<IMain>();               //主页
            IManageMain manage = ioc.Resolve<IManageMain>();  //管理员

            Console.WriteLine(login.LoadBody());
            Console.WriteLine(manage.EditUser());
            */
            ContainerBuilder cb = new ContainerBuilder();         
            Assembly asm = Assembly.Load("AutoFac_Demo02");  //获取所有实现类对应的程序集
            cb.RegisterAssemblyTypes(asm).AsImplementedInterfaces();  //注册程序集中的所有接口
            IContainer ioc = cb.Build();    //构建
            IMain login = ioc.Resolve<IMain>();              
            IManageMain manage = ioc.Resolve<IManageMain>();
            Console.WriteLine(login.LoadFoot());
            Console.WriteLine(manage.GetManageInfo());
            Console.Read();
             
        }

假设:登录和未登录的模块一样,显示数据一样

interface ILogin

class Login:ILogin 

class NoLogin:ILogin 

    interface ILogin
    {
        string GetInfo();
    }
    class Login : ILogin
    {
        public string GetInfo()
        {
            return "已登录";
        }
    }
    class Nogin : ILogin
    {
        public string GetInfo()
        {
            return "未登录";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ContainerBuilder cb = new ContainerBuilder();
            Assembly asm = Assembly.Load("AutoFac_Demo02");  //获取所有实现类对应的程序集
            cb.RegisterAssemblyTypes(asm).AsImplementedInterfaces();  //注册程序集中的所有接口
            IContainer ioc = cb.Build();    //构建
            IEnumerable<ILogin> ls = ioc.Resolve<IEnumerable<ILogin>>();
            foreach (var item in ls)
            {
                Console.WriteLine(item.GetInfo()); 
            }
        }
    }
原文地址:https://www.cnblogs.com/Zingu/p/14705716.html