zoukankan      html  css  js  c++  java
  • 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()); 
                }
            }
        }
  • 相关阅读:
    在Perl里 对象就是hash引用
    第十二章 对象(上):
    连锁百货企业数据分析系统建设方案
    连锁百货企业数据分析系统建设方案
    java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException
    通过Net::Ping 理解Perl的面向对象
    org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
    Attempt to refer to a unregistered pool by its alias 'dbpool'
    Error:[$parse:lexerr]
    keepalived 监测域名解析脚本
  • 原文地址:https://www.cnblogs.com/Zingu/p/14705716.html
Copyright © 2011-2022 走看看