• C# 对IOC的理解 依赖的转移


    原文:https://blog.csdn.net/huwei2003/article/details/40022011

    系统 可方便的替换 日志类

    自己的理解:
      依赖接口,日志的实例化 不直接写在依赖类中,而是放在构造函数的参数中。目的:谁调用谁实现。然后再借助ioc自动实例化注入到构造函数中

    依赖的进化

        //1、直接依赖Log类
        //   系统更换Log类比较麻烦,因为每个类都依赖具体的实现类
        public class ProductService1
        {
            private Log _log;
    
            public ProductService1()
            {
                _log = new Log();
            }
    
            public void SayHello()
            {
                _log.Write();
            }
        }
    
        //2、依赖接口ILog
        //   方法的调用依赖接口ILog。以前是依赖具体实现类Log,换成依赖接口类ILog,这样在构造函数中可以更换其它的实现类
        //   在构造函数中 强依赖 ILog的具体实现
        public class ProductService2
        {
            private ILog _log;
    
            public ProductService2()
            {
                _log = new Log();
            }
    
            public void SayHello()
            {
                _log.Write();
            }
        }
    
        //3、强依赖的地方 变成了 谁调用谁实现
        //   这样就可以 不再类ProductService3的内部 具体实现ILog,把实现的地方,转移到类的外部
        public class ProductService3
        {
            private ILog _log;
    
            public ProductService3(ILog _log)
            {
                this._log = _log;
            }
    
            public void SayHello()
            {
                _log.Write();
            }
        }

    日志类

        //日志接口
        public interface ILog
        {
            void Write();
        }
        //日志类1 实现 日志接口
        public class Log : ILog
        {
            public void Write()
            {
                Console.Write("Log");
            }
        }
        //日志类2 实现 日志接口
        public class TxtLog : ILog
        {
            void ILog.Write()
            {
                Console.Write("TxtLog");
            }
        }
        //日志类3 实现 日志接口
        public class DbLog : ILog
        {
            void ILog.Write()
            {
                Console.Write("DbLog");
            }
        }
    View Code

    调用方法

            //这种写法 一个不好地方。有很多类需要依赖ILog,就在很多个地方依赖
            public void test4()
            {
                ILog log = new Log();
                var productService = new ProductService3(log);
                productService.SayHello();
            }
    
    
            //依赖由ioc框架自动管理
            public void test5()
            {
                ContainerBuilder builder = new ContainerBuilder();
    
                //替换系统的日志类
                //builder.RegisterType<Log>().As<ILog>();
                //builder.RegisterType<TxtLog>().As<ILog>();
                builder.RegisterType<DbLog>().As<ILog>();
    
                builder.RegisterType<ProductService3>();
                IContainer container = builder.Build();
                var productService = container.Resolve<ProductService3>();
                productService.SayHello();
            }
  • 相关阅读:
    (笔记)Linux内核学习(二)之进程
    (笔记)Linux内核学习(一)之内核介绍
    状态机思路在程序设计中的应用
    内存操作函数memmove,memcpy,memset
    linux下常用的几个时间函数:time,gettimeofday,clock_gettime,_ftime
    Camera ISO、快门、光圈、曝光这几个概念
    C语言中的指针和内存泄漏几种情况
    音视频文件码率与大小计算
    CC++中 fopen中文件打开方式的区别:
    常用DOS命令
  • 原文地址:https://www.cnblogs.com/guxingy/p/10855160.html
Copyright © 2020-2023  润新知