十二个 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是不支持属性注入了.

posted @ 2017-05-19 17:23  TeemoHQ  阅读(3284)  评论(1编辑  收藏  举报