(前頁)<<      >>(次頁)          (Up)

2章 準備勉強
2.3 C#で制作されたモデルのDLLを取り込む



 プログラムが動作するためには、何処かで インスタンスを生成する箇所( 例えば new DynamicWaveModel( ) , new DynamicWavePrptyInf( ) と記述する箇所)が必要です。 その箇所を メインプログラム側に記述すると、 新しい派生クラスの提供を受ける度に メインプログラム側の コンパイルが必要となります。 そこで、インスタンスを生成する箇所をDLL内で行い、それをDLLとして一緒に提供すれば、メインプログラム側ではモデルの提供を受けてもコンパイルの必要がなくなります。 メインプログラム側では、DLLを取り込む処理を持つ必要がありますが、ここでは、モデル提供者側が行うべき手順に興味があるので、ここでの説明では、、DLL取り込み部分はダミー処理となっています。
 上記の様に クラスの生成を行うクラスを Factoryクラスとして定義します。 そして、必要なクラスのインスタンスを生成する処理は Factoryクラスに任せます。FactoryはDLLと一緒に提供します。

     

 Factoryクラス本体は メインプログラム側でDLLを取り込む際に そのファクトリクラスのインスタンスを取得します。 メインプログラムは 取得したFactoryクラスに 自分が使用するインスタンスの生成を依頼します。 インスタンスの生成を行うことができれば その後の処理は 前節で示した通りにそのインスタンスを計算のフレームワークに組み込むことができます。

 前節で作成したDLLにFactoryクラスを組み込みます。 先ず親クラスDLL:RiverModelDLL に Factoryクラスの親クラスを追加します。 Factoryクラスには、モデルクラス生成メソッドと、プロパティ情報生成メソッドが必要です。 また複数のFactoryクラスを区別するためにID番号をつけておきます。

        

namespace RiverModelDLL
{
    public class MdlFactory
    {
        /// <summary>ID番号取得</summary>
        /// <returns>ID番号</returns>
        public virtual long GetIDNo()
        {
            return 0;
        }
        /// <summary>モデルインスタンス生成</summary>
        /// <returns>RiverModel</returns>
        public virtual RiverModel CreateModel()
        {
            return new RiverModel();
        }
        /// <summary>モデルインスタンス生成</summary>
        /// <returns>RiverModel</returns>
        public virtual PrptyInf CreateProperty()
        {
            return new PrptyInf();
        }
    }
} 

  次に派生クラス側プロジェクトにも 独自Factoryクラスを(MdlFactoryクラスの派生として)追加します。

namespace DynamicWaveLine
{
    public class DynamicWaveFactory : MdlFactory
    {
        /// <summary>ID番号取得</summary>
        /// <returns>ID番号</returns>
        public override long GetIDNo()
        {
            return 1;
        }
        /// <summary>モデルインスタンス生成</summary>
        /// <returns>RiverModel</returns>
        public override RiverModel CreateModel()
        {
            return new DynamicWaveModel();
        }
        /// <summary>モデルインスタンス生成</summary>
        /// <returns>RiverModel</returns>
        public override PrptyInf CreateProperty()
        {
            return new DynamicWavePrptyInf();
        }
    }
} 

 また、各派生クラスモデルのDLLと取り込む時に Factoryクラスのインスタンスを取り込むために下記を追加します。

namespace _MY_SYSTEM_
{
    public class FACTORY_CREATOR
    {
        public RiverModelDLL.MdlFactory CreateFactory()
        {
            // ToDo 自作のモデルファクトリ(ネームスペース付き)を new して下さい。
            return new DynamicWaveLine.DynamicWaveFactory();
        }
    }
} 
     * ↑ この部分は 本節の本題とは離れるので、Factoryを生成する記述があるということだけを覚えておきます。

 次にメインプログラム側では 各DLLを取り込むための処理と、指定したファクトリにモデル等を生成させる処理を組み込みます。 本節のコーディングはダミー処理ですので、各DLLの内のFactoryクラス名称やnamespace を意識していますが、 正式には それらを認識する必要はありません。 取り込んだFactoryクラスを管理するためにFactorySetというクラスを定義し、このクラスに プログラム起動時に引数で与えたID番号で 生成するモデルを選択できるようにします。

namespace ModelMain
{
    public class FactorySet
    {
         −− 内容の記述は省略 −−
    }
}

namespace ModelMain
{
    class Program
    {
        static void Main(string[] args)
        {
            FactorySet csFctrySet = new FactorySet();

            // ↓引数で与えられたID番号を認識する↓
            long FctryID = 0;
            if (args[0] == "1")
            {
                FctryID = 1;
            }
            else
            {
                FctryID = 2;
            }
            // ----↓ この部分をFactoryクラスに任せる ↓----
            // モデルインスタンス生成
            //RiverModel csRvrMdl = new RiverModel();
            //RiverModel csRvrMdl = new DynamicWaveModel();
             RiverModel csRvrMdl = csFctrySet.CreateModel(FctryID);
           
            // ----↓ この部分をFactoryクラスに任せる ↓----
            // プロパティ情報インスタンス生成
            //PrptyInf csMdlPrp = new PrptyInf();
            //PrptyInf csMdlPrp = new DynamicWavePrptyInf();
            PrptyInf csMdlPrp = csFctrySet.CreateProperty(FctryID);
            // ↑引数で与えられたID番号を認識する↑

            // プロパティ情報を設定
            。。。。。。 以後は同じプログラム 。。。。。。


    ( 制作したプログラム: (RiverMDL2.lzh)   Microsoft Visual C# で .\RiverMDL\ModelMain.sln を 開きます。)



 ここで作成したプログラムを動作させてみます。
 Microsoft Visual C# のディバッグモードで動作させる時に引数を与える場合には スタートアッププロジェクトのプロパティ設定画面のディバッグからコマンドライン引数を設定します。

     

     

 引数として 「1」を与えた時には DynamicWaveModelが、それ以外の時には KinematicWaveModelが生成されて動作します。




 DLLを取り込む処理は 「モデル作成」の主題からは離れるのでここでは詳しくは触れません。
  ここでは

  @DLLに Factoryクラスが必要である。

  A必要なインスタンスの生成はFactoryクラスに任せる。

  BDLLを取り込む時に Factoryクラスを生成する為の宣言が必要。


 という事のみ覚えておきます。


(前頁)<<      >>(次頁)

初版:2013/06/12 |