我正在处理一个简单的WCF应用程序,但是我在正确设置存储库模式时遇到了问题。应用程序的通信模式大致如here所示。
我关注的是Admin Console Mode
部分。在此模式下,管理员可以访问某些管理功能,例如添加用户和查看现有用户等。
此模式所需的其中一个实体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
方法返回的Users对象列表?我试过这种方式:
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对象不是可枚举的对象。如何修改Users
实体以及repository contract
和repository implementation
以便返回Users
对象以显示在屏幕上?
答案 0 :(得分: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);
}