IOC容器Autofac使用

今天我沉浸在IOC的設計模式追求中,聽了不少課,也看了不少例子,這個是個人一個測試項目程序員

爲了測試代碼,我首先準備了兩個類一個Car和接口ICar,這兩個類和咱們平時項目中的DAL與IDAL類似,如今咱們開始!編程

1.首先添加一個類InitAutofac在咱們的程序中json

對了,這個是個人程序集設計模式

這個有點小問題,由於我ICar和Car放在了SourceClass文件中可是問題不大框架

 

2.如今咱們引用Autofac工具

3.下載Autofac測試

可能有的小夥伴在網上搜了不少的autofac的例子,可是我要告訴你,這個版本號很重要!由於4.0以後有這段代碼運行不了ui

這個是什麼呢?咱們先不看new關鍵字以前的東西,細心的小夥伴會看到這個config是否是配置文件啊,沒錯!這就是經過配置文件注入的方法,記住,從4.0以後autofac不支持這種寫法!
推薦用xml,或者json文件的方式去注入!這裏只是提一下咱們往下看!
 builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

這個東西也要下載!spa

4.查看引用+添加代碼設計

 

是否是添加了這兩個東西,如今工具備了,到了咱們代碼登場了!

首先是ICar的接口類

public interface ICar {
        void Engine(int value);
        void Run();
    }

裏面定義了一個引擎發動的檔數和汽車的跑方法,由於這是汽車運行的最基本方法吧

而後到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分,好了我要去睡覺了!

相關文章
相關標籤/搜索