IOC简介
IOC思想
把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象。
那组件之间的交互怎么处理呢?那最好的方式就是把new的操作交给第三方的治理框架去做,
比如往大处说的“Dubbo”, Spring Cloud(服务注册,服务发现,服务自动下线,流量分配,熔断,降级),往小处说就是IOC容器
把类往大处想。
把治理框架往小处想。。
IOC能做到那些
1. 对接口和实现类实现了由原来的零散式管理到现在的集中化管理。 (集中化日志,集中化配置系统 etcd,zookeeper)
new
业务驱动 IOC
产品驱动
2. 对类之间,类接口之间的关联关系可以采用多种模式注入(构造器注入,属性注入)等等。
3. 对实现类的生命周期进行了统一管理,能够控制服务的创建,释放和监控。
4. 对类的依赖由编译时推迟到了运行时。
new
.NET Core中IOC
NUGet 包 Microsoft.Extensions.DependencyInjection
//IOC容器 ServiceCollection services = new ServiceCollection(); //注册服务 每次调用都创建新的类 services.AddTransient<IUserCQRS, UserCQRS>(); ////注册服务 只new一次 //services.AddSingleton<IUserCQRS, UserCQRS>(); //在某个作用于中就是一个单利 services.AddScoped<IUserCommand, UserCommand>(); //服务提供者 var serviceProvider = services.BuildServiceProvider(); var userQCRSImp = serviceProvider.GetService<IUserCQRS>(); Console.WriteLine(userQCRSImp.GetUserName("lalala")); //创建作用域 usercommand1 usercommand2 同一个实例 usercommand4 usercommand3 同一个实例 var scope1 = serviceProvider.CreateScope(); var usercommand1= scope1.ServiceProvider.GetService<IUserCommand>(); var usercommand2 = scope1.ServiceProvider.GetService<IUserCommand>(); var scope2 = serviceProvider.CreateScope(); var usercommand3 = scope2.ServiceProvider.GetService<IUserCommand>(); var usercommand4 = scope2.ServiceProvider.GetService<IUserCommand>();
AOP介绍
AOP思想
我们知道AOP是面向切面编程,很好的解决了系统级的功能和业务功能的耦合问题。。。
.NETCore AOP实现
nuget包 AspectCore.Extensions.DependencyInjection 对应github地址:https://github.com/dotnetcore/AspectCore-Framework 源码中有帮助文档
他也是基于IOC容器的。