2

クライアント (Android アプリ) とサーバー (WebApi REST Web サービス) があります。

アプリには、レコードの読み取りと書き込みのために Web サービスと通信するために呼び出すサービス レイヤーがあります。戻り値は、Web サービスのコントローラーから返されます (つまり、新しいレコードが DB に書き込まれ、関連するレコード ID が生成されるとき)。

私は多くの異なるコントローラーを持っており、それぞれが異なる数と型の値を返す複数のメソッドを持っています (それらはほとんど int 配列を返しますが、非整数値が混在している場合はオブジェクト配列を返すことがあります)。

アプリ側のサービス レイヤーは、引数の数 (配列要素) のチェックや事前定義された無効/初期化されていない値 (-9999 など) のチェックなど、パラメーターを検証するためにいくつかのチェックを行います。

インターフェースを定義して、これらのパラメーター操作を形式化して、両側で使用されるパラメーターの数や型などを 1 つの場所で明示的に指定することはしたくありません (したがって、両側で「翼を広げている」わけではありません)。

ただし、私が直面しているジレンマは、クライアントとサーバーの両方に関連するメソッドを指定する 1 つのインターフェイスを定義するか、それとも通信の側に固有のメソッドをそれぞれ指定する 2 つの別個のインターフェイスを定義するかを決定することです。

単一のインターフェースがある場合、次のようになります。

public interface IServiceParams
{
   object[] CreateParams(int recordId, string recordNumber);

   bool ParseParams(object[] paramz, out int recordId, out string recordNumber);
}

CreateParams は WS 側でのみ使用され、ParseParams は App 側でのみ使用されるため、どちらの側でも空の実装を宣言する必要があります。

Web サービス側:

public class RecordController : ApiController, IServiceParams
{
   object[] IServiceParams.CreateParams(int recordId, string recordNumber)
   {
      return new[] { newRecordId, newRecordNumber };
   }

   bool IServiceParams.ParseParams(object[] paramz, out int recordId, out string recordNumber)
   {
      throw new NotImpementedException();
   }

   ////////////////////////////////////////////////////////////////////////////////////////////

   public object[] Put( Record record )
   {
      if( !DbLayer.Update(record) )
      {
         return null;
      }

      return CreateParams(record.RecordId, record.RecordNumber);
   }
}

アプリ側:

public class RecordService : IServiceParams
{
   object[] IServiceParams.CreateParams(int recordId, string recordNumber)
   {
      throw new NotImpementedException();
   }

   bool IServiceParams.ParseParams(object[] paramz, out string recordNumber)
   {
      if( paramz == null || paramz.Count != 4 )
      {
         return false;
      }

      if(!ParseInt(paramz[0].ToString(), out recordId) || recordIdNew == DEFAULT_RECORD_ID)
      {
         return false;
      }

      // ...

      return true;
   }

   ////////////////////////////////////////////////////////////////////////////////////////////

   public bool UpdateRecord( Record record )
   {
      object[] paramz = WebService.Put( record );

      int recordId; 
      string recordNumber;

      if(!ParseParams(paramz, out recordId, out recordNumber))
      { 
         return false;
      }

      record.RecordId = recordId;
      record.RecordNumber = recordNumber;

      return true;
   }
}    

または、2 つのインターフェイスを定義し、それぞれの側でそれぞれを実装する必要があります。これにより、空の実装を持つ必要がなくなります。

public interface IServiceParamsClient
{
   bool ParseParams(object[] paramz, out int recordId, out string recordNumber );
}

public interface IServiceParamsServer
{
   object[] CreateParams(int recordId, string recordNumber);
}

助けてくれてありがとう!

4

2 に答える 2

2

両方のメソッドを 1 つのインターフェイスで宣言する必要がある理由はありますか? そうでない場合は、それぞれの意図を反映する 2 つの別個のインターフェイスを作成します。「サポートされていない」メソッドを実装する必要があるのは、設計上の匂いです。参照: すべての実装者によってサポートされていない操作がある場合、インターフェイスを設計する正しい方法は何ですか?

于 2013-10-22T16:45:50.357 に答える