ユニティフレームワークを導入する前に、最初のいくつかの概念DIP依存関係逆転の原則、制御のIOC反転、DI依存性注入を言います
DIPは、定義、設計原理の一つである:基礎となる上位に頼るべきではありません、両方が抽象的に依存している、抽象は、抽象化の詳細に依存する必要があり、詳細には依存しません。
これは、全体を理解することは非常に困難な設計原理、つまらない一見、と定義され、それが理解するために実用的な例と組み合わせる必要があります。
一例として、人と通信するために、Huawei社の携帯電話:
クラスHUAWEI { 公共 ボイドダイヤル() { System.Console.WriteLine(" 华为手机拨号... " ); } } クラス人 { プライベート 華電話= 新しいHuawei社()。 公共 ボイド)(コミュニケーション { (phone.Dial)を、 } }
下に属する上位、HUAWEIに属する人は、上位層が下に依存して、下の層が変化する。この例では、Huawei社の携帯電話が壊れている、携帯電話の通信を交換する必要がある、私たちは人のコードを変更する必要があり、根本的な変化は、後に、人が必要と再び起こります変更
この単純なシナリオのように、修正のコストは、それが複雑なシステムであれば、そのような頻繁な変更のコストが高価であり、また我慢する価値があります。
今回は、パッケージ、人はもはや虎尾に依存しますが、抽象インタフェース、抽象インタフェースにも依存HUAWEI依存を変更する必要があります。これは、依存関係逆転の原則です。
インタフェースIPhone { ボイドダイヤル(); } クラスHUAWEI:IPhone { 公共 ボイドダイヤル() { System.Console.WriteLine(" 华为手机拨号.. " ); } } クラス人 { プライベートIPhone電話。 公共人(IPhone電話) { このドットフォン= 電話; } 公共 ボイドは()コミュニケーション { phone.Dial()を。 } }
それとも元の例に、人が虎尾に依存して、HUAWEIは内部新しい人にオブジェクトを使用する必要があり、この結合は、IOCがに対処するための別の容器に新しいHuawei社のオブジェクトを操作することは非常に大きいですが、私たちはコンテナからです制御の反転と呼ばれ、このオブジェクトを取得します。
依存性注入は、IOC DI実装である、コンストラクタ注入、注入性であってもよく、本方法は注射であってもよいです
Unityは次の.NETプラットフォーム、IOCのためのオープンソースのフレームワークです。
言っても過言ではない、コードのステップバイステップ。
我々ログユニティフレームワークのデモのデモを達成するためのプロトタイプのためのデータベースアセンブリーと部品
名前空間UnityLib { パブリックインターフェイスのILog { ボイドWRITELOG(文字列MSG)。 空WRITELOG(例外の例)。 } }
パブリック クラスConsoleLog:のILog { 公共 空 WRITELOG(文字列MSG) { Console.WriteLineを(" コンソールログ" + MSG)。 } 公共 ボイドWRITELOG(例外例) { Console.WriteLineを(" コンソールログ:" + ex.StackTrace)。 } }
パブリック クラスFileLog:のILog { 公共 空 WRITELOG(文字列MSG) { Console.WriteLineを(" ファイルログ:" + MSG)。 } 公共 ボイドWRITELOG(例外例) { Console.WriteLineを(" ファイル・ログ:" + ex.StackTrace)。 } }
名前空間UnityLib { パブリック インターフェイスするIDatabase { 空の追加(); 無効)(削除します。 空の更新(); 空のクエリ(); } }
名前空間UnityLib { パブリック クラスEFDataBase:するIDatabase { 公共 ボイド(追加) { Console.WriteLineを(" EF追加" ); } 公共 ボイドは()を削除 { Console.WriteLineを(" 削除EFを" )。 } 公共 ボイド更新() { Console.WriteLineを(" EF更新" )。 } 公共 ボイドクエリ() { Console.WriteLineを(" EFUpdate " )。 Console.WriteLineを(" クエリ" ); } } }
名前空間UnityLib { パブリック クラスSQLServerDataBase:するIDatabase { 公共 ボイド(追加) { Console.WriteLineを(" SQLServerの追加" ); } 公共 ボイドは()を削除 { Console.WriteLineをは(" SQLServerの削除します" )。 } 公共 ボイド更新() { Console.WriteLineを(" SQLServerの更新" )。 } 公共 のボイドクエリ() { Console.WriteLineを(" SQLServerのクエリ" )。 } } }
プロファイル:
<?XMLバージョン= " 1.0 "エンコード= " UTF-8 "?> <構成> <configSections> <セクション名= " 団結"タイプ= " Microsoft.Practices.Unity.Configuration.UnityConfigurationSection、 Microsoft.Practices.Unity.Configuration " /> </ configSections> <統一> <typeAliases> <typeAlias別名= " するIDatabase "タイプ= " UnityLib.IDataBase、UnityLib " /> <typeAlias別名= " EFDataBase" TYPE = " UnityLib.EFDataBase、UnityLib " /> <typeAliasエイリアス= " SQLServerDataBase "タイプ= " UnityLib.SQLServerDataBase、UnityLib " /> <typeAliasエイリアス= " のILog "タイプ= " UnityLib.ILog、UnityLib " /> <typeAlias別名= " FileLog "タイプ= " UnityLib.FileLog、UnityLib " /> <typeAliasエイリアス= " ConsoleLog "タイプ= " UnityLib.ConsoleLog、UnityLib" /> </ typeAliases> <コンテナ> <コンテナ名= " DBcontainer " > <タイプtype = " するIDatabase " mapTo = " EFDataBase " NAME = " EF " > </タイプ> <タイプtype = " するIDatabase " mapTo = " SQLServerDataBase "名前= " SQLServerの" > </タイプ> </コンテナ> <コンテナ名= "LogContainer " > <タイプtype =" のILog " mapTo = " FileLog " NAME = " ファイル" > </タイプ> <タイプtype = " のILog " mapTo = " ConsoleLog " NAME = " コンソール" > </タイプ> </容器> </コンテナ> </団結> <スタートアップ> <supportedRuntimeバージョン= " V4.0 " SKU = " .NETFramework、バージョン= V4.5.1 " /> </スタートアップ> </設定>
クライアントコード:
クラスプログラム { 静的 ボイドメイン(文字列[]引数) { UnityConfigurationSection部 =(UnityConfigurationSection)ConfigurationManager.GetSection(" 結束" )。 VaRの logContainer = 新しいUnityContainer(); VAR dbContainer = 新しいUnityContainer(); section.Configure(logContainer、" LogContainer " ); section.Configure(dbContainer、" DBcontainer " ); VARログ= logContainer.Resolve <のILog>(" コンソール" )。 VaRのデシベル= dbContainer.Resolve <するIDatabase>(" EF " )。 log.WriteLog(" 测试の信息" ); db.Add(); } }
Unityは、あなたの参照のためのエントリとして、コードのシンプルなアプリケーションフレームワークよりも、無綿密な研究です。
注:上記はUnity3.Xです。。。