今天我沉浸在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分,好了我要去睡覺了!