3

私の標準的なデータ アクセスのレイアウトには、素晴らしくシンプルなインターフェイスが含まれます。

    public interface IUserDao
    {
      User GetUser(int userId);
    }

次に、単体テスト用にデータ層の別の実装に切り替えることができます。標準的な使用法は、MVP のプレゼンターから、データをビューにプッシュするなどの簡単なことを行うことです。

    public void UserSelected(int userId)
    {
       User user = daoFactory.UserDao.GetUser(userId);

       view.FirstName = user.FirstName;
       view.LastName = user.LastName;
    }

この場合、データ アクセスは非同期で完了する必要があります。非同期呼び出しの要件がデータ インターフェイスにまで及ぶ必要があるかどうかは、よくわかりません。

例えば

    public interface IUserDao
    {
      void GetUserBegin(int userId);
      User GetUserEnd();
    }

インターフェイスを変更する必要がありますか、それとも非同期アクセスの要件は呼び出しコードの実装の一部ですか?

編集 :

私の簡単な例が役立つと思っていましたが、実際には混乱を引き起こしている可能性があります。私はRestSharpを使用して必要なデータを取得しており、非同期部分を適切に処理しています。私がうまくいかないのは、テスト中に切り替えることができるように、このロットの周りにインターフェイスをラップする方法です。

public UserDao : IUserDao
{
    public void GetUser(int userId)
    {           
        var request = new RestRequest("User/GetUser/{id}", Method.POST);

        // replaces matching token in request.Resource
        request.AddUrlSegment("id", id.ToString()); 

        //Create the client
        var client = AuthenticatedRestClient();

        //Execute
        client.ExecuteAsync(request, response =>
        {
            ProcessUser(response);
        });
    }        

    public static void ProcessUser(IRestResponse response)
    {
        //Extract the user from the reponse
        User user = (User)ProcessResponse<User>(response);
    }
}
4

3 に答える 3

4

最新バージョンの .NET を使用している場合は、次を利用できますasync - await

public interface IUserDao
{
    Task<User> GetUser(int userId);
}

public async Task UserSelected(int userId)
{
   User user = await daoFactory.UserDao.GetUser(userId);

   view.FirstName = user.FirstName;
   view.LastName = user.LastName;
}

GetUserの実装はを返す必要があることに注意してくださいTask<User>

バージョン .NET 4.0 を使用している場合は、上位メソッドTaskから呼び出す ために使用できます。UserSelected

Task.Factory.StartNew(() => UserSelected(userId));
于 2013-05-16T09:57:10.657 に答える
4

あなたが待機パターンを使用している場合、あなたはただ行うことができます

public interface IUserDao
{
  Task<User> GetUser(int userId);
}

そしてそれを呼び出す

 User user = await daoFactory.UserDao.GetUser(userId); 

このメソッドが非同期で呼び出されるように作成されたことをアプリケーション層に通知するので、これは素晴らしいことです。

于 2013-05-16T09:57:28.897 に答える