ユニティフレームワークスターター

ユニティフレームワークを導入する前に、最初のいくつかの概念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です。

おすすめ

転載: www.cnblogs.com/niuge/p/11079326.html