2

要件は、保留中のレコードの db テーブルをポーリングするために使用される現在の Windows サービス アプリ (C# を使用した .net 2.0 からデザイン パターンを使用した .net 4.5) を書き直すことです。保留中のレコードがある場合は、タイプに基づいて処理します。 . 約 30 の異なるジョブ リクエストが可能であり、これらのジョブ リクエストに対応するために約 10 のクラスを作成しました。一部のクラスは複数のジョブ タイプに対応します。

AddCreditCard、DeleteCreditCard、UpdateCreditCard と同様に、1 つのクラスに含めることができますが、3 つの異なるジョブ タイプにすることができます

現在、コードは switch case を使用して、ジョブを提供する適切なオブジェクトを作成しています。しかし、問題は非常に静的であり、所有権はWindowsサービスにあります。抽象クラスのようなリクエストを受け取り、タイプに基づいてオブジェクトを作成し、リクエストを特定のクラスに渡すパターンが必要だと思います(ここと同じですが、素敵なパターンで)

switch (currentRecord.ProcessingType)
        {
        case AddCreditCard:
                {
                    CreditCardProcess ccd = new CreditCardProcess();
                    retVal = ccd.AddCreditCard(currentRecord);
                    if (retVal)
                    {
                        currentRecord.Status = 'C';
                        currentRecord.ErrDesc = '';
                    }
                    else
                    {
                        currentRecord.Status = 'E';
                        currentRecord.ErrDesc = 'failed to process';
                    }
                    break;
                }
                #endregion 
        case UpdateCreditCard:
                {
                    CreditCardProcess ccd = new CreditCardProcess();
                    retVal = ccd.UpdateCreditCard(currentRecord);
                      if (retVal)
                    {
                        currentRecord.Status = 'C';
                        currentRecord.ErrDesc = '';
                    }
                    else
                    {
                        currentRecord.Status = 'E';
                        currentRecord.ErrDesc = 'failed to process';
                    }
                    break;
                }
        case DeleteCreditCard:
                {
                    CreditCardProcess ccd = new CreditCardProcess();
                    retVal = ccd.DeleteCreditCard(currentRecord);
                      if (retVal)
                    {
                        currentRecord.Status = 'C';
                        currentRecord.ErrDesc = '';
                    }
                    else
                    {
                        currentRecord.Status = 'E';
                        currentRecord.ErrDesc = 'failed to process';
                    }
                    break;
                }
        case AddACH:

        case DeleteACh:

        case ModifyACH:

        case Authorize:

        case SalesTran:


                #endregion

C#で.NET 4.5を使用しています

4

2 に答える 2

1

リフレクションを使用して TypeName を ClassName と一致させ、一般的な実行機能を持たせます。例えば

Interface Actions {
    public execute();
}

class AddCreditCard:Actions
  {
    execute()
      {
          // do DAO for add (etc)
      }
  }

Type typeObj asembly.GetType(currentRecord.ProcessingType);
object actionInstance = Activator.CreateInstance(typeObj);
actionInstance.Execute() ;

そしてthtのようなもの..

于 2013-05-16T06:17:34.733 に答える
0

メソッドを ccd に追加し
ます ケースはまだありますが、ccd にカプセル化されています

public Int RetVal Process (Record currentRecord)
{

}
于 2013-05-15T21:01:08.037 に答える