zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    绝对布局absoluteLayout
    表格布局tabelLayout
    DP问题如何确定状态
    秒杀多线程第四篇 一个经典的多线程同步问题
    循环队列
    【Unity3d】【项目学习心得】从资源server下载资源(一)
    矩阵经典题目六:poj 3070 Fibonacci
    Mean Shift具体介绍
    Android ViewPager使用具体解释
    Android中ExpandableListView控件基本使用
  • 原文地址:https://www.cnblogs.com/guxingy/p/10855160.html
Copyright © 2011-2022 走看看