2012-04-15 5 views
2

私は単純なWCFアプリケーションで作業しており、リポジトリパターンを正しく設定することに問題があります。アプリケーションの通信パターンは、おおよそ図のようにhereです。リポジトリパターンを使用するときに列挙可能なオブジェクトを返す方法は?

Admin Console Modeという部分には関心があります。このモードでは、管理者は、など、このモードのために必要なエンティティの1、Users

抽象契約を、ユーザーの追加や既存のユーザーを表示するようないくつかの管理機能へのアクセスを持って次のようになります。

public interface IUserRepository 
{ 
    byte AddUser(string _loginname, string _loginpass); 
    Users ShowAllUsers(); 
} 
このリポジトリの

具体的な実装:

public class UserRepository : IUserRepository 
{ 
    public UserRepository(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public byte AddUser(string _loginname, string _loginpass) 
    { 
     . . . 
    } 

    public Users ShowAllUsers() 
    { 
     string query = "select login_name,created_time from users"; 

     using(SqlConnection conn = new SqlConnection(_connectionString)) 
     { 
      using(SqlCommand cmd = new SqlCommand(query, conn)) 
      {      
       conn.Open(); 

       using(var reader = cmd.ExecuteReader()) 
       { 
        if(!reader.Read()) 
         return null; 

        return new Users 
        { 
         Login_Name = reader.GetString(reader.GetOrdinal("login_name")), 
         Login_Pass = reader.GetString(reader.GetOrdinal("login_pass")), 
         Created_Time = reader.GetDateTime(reader.GetOrdinal("created_time")), 
        }; 
       } 
      } 
     } 
    } 
} 

ホスト層から、どのように私は、オブジェクトがShowAllUsersメソッドから返されたユーザーのリストにアクセスできますか?私はこの方法を試してみました:

public void ShowUsers() 
{ 
    Users user = _repo.ShowAllUsers(); 

    Console.WriteLine("Name\tCreated Time"); 

    foreach(Users u in user) 
    { 
     Console.WriteLine("{0}\t{1}",u.Login_Name,u.Created_Time); 
    } 
} 

私が理解から、ユーザーが列挙オブジェクトでないオブジェクトので、これは明らかに動作しません。 Usersオブジェクトとrepository contractrepository implementationを変更して、Usersオブジェクトが画面に表示されるように戻すにはどうすればよいですか?

Users.cs
UserRepository.cs
IUserRepository.cs

+0

私は質問の下部に定義 'Users.cs'が含まれています。 – Animesh

答えて

4

エンティティ:

// note the singular form, it makes much more sense for me, as far as the object represents a single entity (user) 
// also not an interface, optionally 
public class User : IUser 
{ 
} 

リポジトリ:

public class UserRepository : IUserRepository 
{ 
    public IEnumerable<IUser> ShowAllUsers() 
    { 
     ... 
     while (reader.Read()) 
     { 
      yield return new User 
      { 
       ... 
      }; 
     } 
    } 
} 

あなたはADOから切り替えたいかどうので、私は、どこにでもヨーヨー用途のインタフェースをお勧めします。 NET ORMに問い合わせると、はるかに少ないコードを書き直す必要があります。


使用法:

foreach (User u in users) 
{ 
    Console.WriteLine("{0} created on {1}", u.Login, u.CreationTime); 
} 
+0

+1。 'if(!reader.Read())return'が' while(reader.Read())return 'を返すと言うことができます。 – dasblinkenlight

+0

@ dasblinkenlight:確かに、あなたは正しいと思います。私はあなたがそれを示唆した同じ瞬間に自分自身を追加しました:) – abatishchev

+0

@dasblinkenlight:ありがとう!それに気をつけます。とにかく襲撃されたときに拭き取られました。( – abatishchev

関連する問題