1

私はパターンのデザインに不慣れで、今はストラテジーパターンを実装したいと思っています。これが私のコードです:

namespace StrategyPattern
{
    public interface ISendBehavior
    {
        void Send();
    }

    public class SendAppointment : ISendBehavior
    {
        public void Send()
        {
            // send item
        }
    }

    public class SendTask : ISendBehavior
    {
        public void Send()
        {
            // send item
        }
    }

    public class SendItem
    {
        ISendBehavior _sendBehavior;

        public SendItem(ISendBehavior sendbehavior)
        {
            _sendBehavior = sendbehavior;
        }

        public void Send()
        {
            _sendBehavior.Send();
        }
    }

    /* CALL */

    public class Aanroep
    {
        public void Verzenden()
        {
            SendItem app = new SendItem(new SendAppointment());
            app.Send();
        }

    }
}

SendAppointmentクラスのSendメソッドでは、アイテムが送信されます。私の質問は、このクラスのデータベースに接続する必要がありますか?もしそうなら、私もSendTaskでデータベースに接続する必要があります。しかし、この時点で私は自分自身を繰り返していますよね?したがって、接続文字列が変更された場合は、すべてのクラスでこれを変更する必要があります。どうすればこの問題を解決できますか?

4

3 に答える 3

2

データベース操作のために、別の抽象化レイヤーを作成することもできます。この層は、アクセスを一元化するすべてのデータベース要求を処理する責任があります。接続文字列は外部で構成する必要があり、データマッピングレイヤーはそれらに直接アクセスできます。

リポジトリパターンは、このレイヤーに適用できる適切なパターンです。ドメインオブジェクトとデータマッピングレイヤーの間に配置できます。

于 2009-09-22T10:20:59.283 に答える
1

ISendBehaviorの各実装者を、データベース接続を担当するさらに別のオブジェクトで初期化するのはどうですか?

Verzenden()-実装は次のようになります

IDatabaseConnection connection = new DatabaseConnection();

SendItem app = new SendItem( new SendAppointment( connection ) );

ISendBehavior.Send()は次のように実装されます

_databaseConnection.Send( ... ); // fill behavior-specific information here (perhaps with properties)

このようにして、そのIDatabaseConnectionを他のクラスに再利用できます。

于 2009-09-22T10:05:24.427 に答える
0

接続をクラスに渡すというLennaertの回答が気に入らないので、それを逆にして、単純なコマンドパターンを使用する接続クラスを作成し、クラスをパラメーターとして渡してみませんか?

于 2010-09-08T23:33:12.680 に答える