十二個 ASP.NET Core 例子——IOC


  目錄

  1. 簡單介紹
  2. 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;
        }
    }
View Code

  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());

            });
        }
View Code

  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" };
        }
    }
View Code

     在注冊的時候會發現有三種不同的方法解釋下

Transient 每次都重新創建一個實例。
Singleton 創建一個單例,以后每次調用的時候都返回該單例對象。
Scoped 在當前作用域內,不管調用多少次,都是一個實例,換了作用域就會再次創建實例,類似於特定作用內的單例。

  每次刷新頁面你會看到除了singleton的guid,其他變了.

  在注入的時候是構造函數注入,也有屬性注入,方法注入等方法.但是core是不支持屬性注入了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM