目錄
- 簡單介紹
- 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()}\n{_newGuidService.GetID()}\n{_instanceGuidService.GetID()}\n" }; } }
在注冊的時候會發現有三種不同的方法解釋下
Transient | 每次都重新創建一個實例。 |
Singleton | 創建一個單例,以后每次調用的時候都返回該單例對象。 |
Scoped | 在當前作用域內,不管調用多少次,都是一個實例,換了作用域就會再次創建實例,類似於特定作用內的單例。 |
每次刷新頁面你會看到除了singleton的guid,其他變了.
在注入的時候是構造函數注入,也有屬性注入,方法注入等方法.但是core是不支持屬性注入了.