目录
- 简单介绍
- core自带IOC的实现解释
1.简单介绍 (个人理解)
是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了
怎么用:和IOC容器说你这次要哪些类别的类,要用的时候和IOC容器说,IOC容器给你创造出来这个类然后给你[注入和注册]
实现原理:反射和工厂
依赖原则
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体,具体应该依赖于抽象。
注意点:core自带的IOC容器不支持属性注入
2.core自带IOC的实现解释
这里先实现运行起来看看,再解释细节.
a.创建好自己流程中需要实现的哪些类
public interface IGuidService { Guid GetID(); } public interface INewAlwaysGuidService :IGuidService { } public interface INewGuidService : IGuidService { } public interface IInstanceGuidService : IGuidService { } public class NewAlwaysGuidService : INewAlwaysGuidService { public NewAlwaysGuidService() { ID =Guid.NewGuid(); } public Guid ID; public Guid GetID() { return ID; } } public class NewGuidService : INewGuidService { public NewGuidService() { ID = Guid.NewGuid(); } public Guid ID; public Guid GetID() { return ID; } } public class InstanceGuidService : IInstanceGuidService { public InstanceGuidService() { ID = Guid.NewGuid(); } public Guid ID; public Guid GetID() { return ID; } }
b.根据自己构思好的流程,先和IOC说你要什么类,注册下
public void ConfigureServices(IServiceCollection services) { services.AddTransient<INewAlwaysGuidService, NewAlwaysGuidService>(); services.AddScoped<INewGuidService, NewGuidService>(); services.AddSingleton<IInstanceGuidService, InstanceGuidService>(); // Add framework services. services.AddMvc(options => { //options.Filters.Add(new MyActionFilter()); }); }
c.和IOC说我要哪些类,IOC容器创造好给你
public class HomeController : Controller { private INewAlwaysGuidService _newAlwaysGuidService; private INewGuidService _newGuidService; private IInstanceGuidService _instanceGuidService; public HomeController(INewAlwaysGuidService a, INewGuidService b, IInstanceGuidService c) { _newAlwaysGuidService = a; _newGuidService = b; _instanceGuidService = c; } public IActionResult Index() { return new ContentResult{Content=$"{_newAlwaysGuidService.GetID()} {_newGuidService.GetID()} {_instanceGuidService.GetID()} " }; } }
在注册的时候会发现有三种不同的方法解释下
Transient | 每次都重新创建一个实例。 |
Singleton | 创建一个单例,以后每次调用的时候都返回该单例对象。 |
Scoped | 在当前作用域内,不管调用多少次,都是一个实例,换了作用域就会再次创建实例,类似于特定作用内的单例。 |
每次刷新页面你会看到除了singleton的guid,其他变了.
在注入的时候是构造函数注入,也有属性注入,方法注入等方法.但是core是不支持属性注入了.