IOC 컨테이너 Autofac를 사용

오늘은, 내가 수업을 많이 듣고, IOC의 디자인 패턴의 추구에 몰두 많은 예제를 보았다이 내 테스트 프로젝트 중 하나입니다

코드를 테스트하기 위해, 내가 먼저 두 클래스 차를 준비하고 ICAR을 인터페이스,이 두 클래스를 우리 보통 비슷한 IDAL와 DAL 프로젝트, 지금부터 시작!

1. 먼저, 우리의 프로그램 InitAutofac에 클래스를 추가

예,이 내 조립입니다

이 작은 문제, I ICAR 및 차량 sourceClass를 문서에 있지만 큰 문제가 있기 때문에

 

2. 이제 우리는 Autofac를 인용

3. 다운로드 Autofac

온라인 검색 autofac 많은 예에서 작은 파트너를 가지고 있지만, 내가 당신에게 할 수 있습니다,이 버전은 매우 중요합니다! 이 코드는 4.0 후에 실행할 수 없습니다들 때문에

그것은 무슨이인가? 우리는 새로운 키워드 앞에 사물을 보지 않는다,이 표시됩니다 세심한 주니어 파트너 예, 설정 구성 파일 아하지 않습니다! 이것은, 4.0 autofac는 이러한 접근 방식을 지원하지 않습니다 이후부터, 구성 파일을 주입하는 방법을 기억합니다! 
권장 XML, JSON 파일 또는 주입하는 방법! 여기에서 우리는 단지 내려다 볼 언급!
builder.RegisterModule (  ConfigurationSettingsReader ( " autofac " ));

이 일이 다운로드해야합니다!

+ 4. 추가 코드를 참조하십시오

 

이 두 가지를 추가하고, 지금은 도구가 아니라, 우리가 데뷔 할 수있는 코드를!

첫 번째는 인터페이스 클래스 ICAR입니다

공중  인터페이스 ICAR {
         공극 엔진 ( INT의 값);
        무효 ) (실행; 
    }

里面定义了一个引擎发动的档数和汽车的跑方法,因为这是汽车运行的最基本方法吧

然后到Car中是这么写的

可以看到我们的车库有三款车,其实我最喜欢宝马23333!

当然这三款车都继承了ICar的接口去实现方法

public class AudiCar : ICar
    {
        private static int Speed;
        public void Engine(int value)
        {
            int Row = value * 300;
            Speed = Row / 13;
        }

        public void Run()
        {
            Console.WriteLine("奥迪车正以{0}码的速度行驶!",Speed);
        }
    }
    public class BenzCar : ICar
    {
        private static int Speed;
        public void Engine(int value)
        {
            int Row = value * 300;
            Speed = Row / 12;
        }

        public void Run()
        {
            Console.WriteLine("奔驰车正以{0}码的速度行驶!", Speed);
        }
    }
    public class FordCar : ICar
    {
        private static int Speed;
        public void Engine(int value)
        {
            int Row = value * 300;
            Speed = Row / 15;
        }

        public void Run()
        {
            Console.WriteLine("福特车正以{0}码的速度行驶!", Speed);
        }
    }

这个时候在看看我们的Program类里面的代码,我注册了一个司机,让他去驾驶车辆

class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Driver(4);
            Console.Read();
        }
        
    }
    
    public class Person {
        public void Driver(int value) {
            ICar car = new AudiCar();
            car.Engine(value);
            car.Run();
        }
    }

可以看到,司机挂挡然后可以开着奥迪车了,那我们运行一下看看

 

奥迪车可以运行了,说明我们的代码没有问题,但是!!!

司机这段代码引用了两个类,一个是接口类,一个是接口的实现类(如果我说的你不明白,请你好好补习接口与类),这并不是我们想要的,

因为如果车坏了,那么此时奥迪车就已经不能开了,那么司机就必须要换车!但是在项目中,这个类相当于已经被编译好了,你已经不能再修改这个类了,此时你就只能看着程序出错了!

所以为了解决这个问题,我们就需要用到依赖倒置原则!为什么要用依赖倒置原则呢?因为我要依赖抽象而不是依赖细节,这样我不管程序出现了什么错误只要我给他一个车他都能开,

那么司机对于车的依赖就会变得松散了,司机就不只是只会开奥迪的司机了,它还可以开其他的车去兜风了!

理解了这段话,说明你已经是可以完全入门的程序员了!

当然这不是我们的主题,现在我们就需要修改代码让这个车变得抽象化

5.IOC框架登场!

首先在我们原先定义的InitAutofac类中添加以下代码

public static class InitAutofac
    {
        static ContainerBuilder _Builder;//申明容器
        public static void InitAutofacs() {
            _Builder = new ContainerBuilder();//实例化
            _Builder.RegisterType<AudiCar>().As<ICar>();//将需要用到的奥迪车注册到容器中
            //_Builder.RegisterType<BenzCar>().As<ICar>();//将需要用到的奔驰车注册到容器中
        }
        static IContainer _container;//申明一个字段这个字段用来对接容器

        static IContainer Container //将对接的内容传输入这个属性!
        {
            get
            {
                if (_container == null)
                {
                    _container = _Builder.Build(); 
                }
                return _container;
            }
        }
        public static T GetFromFac<T>()//定义一个方法在外部调用,使得可以调用车辆
        {
            T t = Container.Resolve<T>();//回传已经被注册在容器内的类----AudiCar!
            return t;
        }
    }

通过这个类,在Program类中调用的形式如下

class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Driver(4);
            Console.Read();
        }
        
    }
    public class Person
    {
        public void Driver(int value)
        {
            InitAutofac.InitAutofacs();
            ICar car = InitAutofac.GetFromFac<ICar>();
            car.Engine(value);
            car.Run();
        }
    }

运行发现,可以运行!这个是结果!说明我们使用这个工具已经成功了

但是我在InitAutofac中注释了一段代码!

//_Builder.RegisterType<BenzCar>().As<ICar>();//将需要用到的奔驰车注册到容器中

就是这个,现在我取消注释后运行,???

发现Audi车改为奔驰车了!那我们的Audi车去哪里了呢?我通过断点测试看

 

 已经进入到断点了,那我们继续执行,发现运行的结果还是奔驰车!说明,奥迪车在注册进入容器的时候被覆盖了!

 这个就是一个问题了,下一篇我就继续讲解IOCAutofac容器的各个方法使用!

通过这个例子我深刻了解到了IOC的强大,使得抽象编程变的会更简单!

这篇博客仅供参观,转载和收藏价值不高,只是一个测试,适合刚入门的程序员,大佬勿喷,如果发现概念理解错误,请及时留言,我会更正博客内容或删除博客

实打实原创小例子 现在是早上01点39分,好了我要去睡觉了!

추천

출처www.cnblogs.com/sandaman2019/p/10971217.html