- IOC(控制反转) + DI(依赖注入)
- 面向接口编程
- 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()); } } }