控制反转容器&依赖注入模式的阅读笔记

勇哥注:

主要是阅读时的代码由java转为C#。



(一)简单示例


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            var movie = new MovieLister();
            var list= movie.MoviesDirectedBy("史蒂文·斯皮尔伯格");

            foreach(var m in list)
            {
                Console.WriteLine($"{m.movieName}\t{m.director}");
            }
            Console.ReadKey();
        }
    }

    public class MovieLister
    {
        private MovieFinder finder;

        public MovieLister()
        {
            finder = new ColonDelimitedMovieFinder("movie.txt");
        }

        public List<Movie> MoviesDirectedBy(string arg)
        {
            var allMovies = finder.findAll();
            var list2 =new List<Movie>();
            foreach (var m in allMovies)
            {
                if(m.director == arg)
                {
                    list2.Add(new Movie() { movieName = m.movieName, director = m.director });
                }
            }
            return list2;
        }
    }

    public class ColonDelimitedMovieFinder: MovieFinder
    {
        private string fnamePath = "";

        public ColonDelimitedMovieFinder(string name)
        {
            this.fnamePath = name;
        }

        public List<Movie> findAll()
        {
            var list = new List<Movie>();
            var txt= File.ReadAllText(this.fnamePath).Split(new string[] { "\n" },StringSplitOptions.RemoveEmptyEntries);

            foreach(var m in txt)
            {
                var ary = m.Split(',');
                if (ary.Length == 2)
                {
                    list.Add(new Movie() { movieName = ary[0].Trim(), director = ary[1].Trim() });
                }
            }
            return list;
        }
    }

    public class Movie
    {
        /// <summary>
        /// 影片名
        /// </summary>
        public string movieName { get; set; }
        /// <summary>
        /// 导演
        /// </summary>
        public string director { get; set; }

      
    }

    public interface MovieFinder
    {
        List<Movie> findAll();
    }



}

/*
movie.txt

星球大战,乔治·卢卡斯
教父,弗朗西斯·福特·科波拉
肖申克的救赎,弗兰克·德拉邦特
阿甘正传,罗伯特·泽米吉斯
楚门的世界,彼得·威尔
泰坦尼克号,詹姆斯卡梅隆
罗马假日,威廉·惠勒
黑暗骑士,克里斯托弗·诺兰
疯狂原始人,埃米尔·库斯图里卡
辛德勒的名单,史蒂文·斯皮尔伯格
侏罗纪公园,史蒂文·斯皮尔伯格
夺宝奇兵,史蒂文·斯皮尔伯格
拯救大兵瑞恩,史蒂文·斯皮尔伯格

*/


image.png




(二)控制反转


using Autofac;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {

        static void Main(string[] args)
        {

            var builder = new ContainerBuilder();
            builder.RegisterType<ColonDelimitedMovieFinder>().As<IMovieFinder>().UsingConstructor(typeof(string));
           
            var container = builder.Build();
            using (var ioc = container.BeginLifetimeScope())
            {
                var service = ioc.Resolve<IMovieFinder>(new NamedParameter("name","movie.txt"));
                var movie = new MovieLister(service);
                var list = movie.MoviesDirectedBy("史蒂文·斯皮尔伯格");

                foreach (var m in list)
                {
                    Console.WriteLine($"{m.movieName}\t{m.director}");
                }
            }
            Console.ReadKey();
        }
    }



    public class MovieLister
    {
        private IMovieFinder finder;

        public MovieLister(IMovieFinder _finder)
        {
            this.finder = _finder;
        }

        public List<Movie> MoviesDirectedBy(string arg)
        {
            var allMovies = finder.findAll();
            var list2 = new List<Movie>();
            foreach (var m in allMovies)
            {
                if (m.director == arg)
                {
                    list2.Add(new Movie() { movieName = m.movieName, director = m.director });
                }
            }
            return list2;
        }
    }

    public class ColonDelimitedMovieFinder : IMovieFinder
    {
        private string fnamePath = "";

        public ColonDelimitedMovieFinder(string name)
        {
            this.fnamePath = name;
        }

        public List<Movie> findAll()
        {
            var list = new List<Movie>();
            var txt = File.ReadAllText(this.fnamePath).Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var m in txt)
            {
                var ary = m.Split(',');
                if (ary.Length == 2)
                {
                    list.Add(new Movie() { movieName = ary[0].Trim(), director = ary[1].Trim() });
                }
            }
            return list;
        }
    }

    public class Movie
    {
        /// <summary>
        /// 影片名
        /// </summary>
        public string movieName { get; set; }
        /// <summary>
        /// 导演
        /// </summary>
        public string director { get; set; }


    }

    public interface IMovieFinder
    {
        List<Movie> findAll();
    }



}


未完待续。。。




autoFac教程:

依赖注入和控制反转的使用

https://www.cnblogs.com/yanbigfeg/archive/2018/10/28/9855960.html


Autofac支持配置文件

https://www.cnblogs.com/yakniu/p/16282880.html




--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-11-03 15:47:40 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864