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

 

posted @ 2019-05-13 10:16  古兴越  阅读(648)  评论(0编辑  收藏  举报