我是C#和MVC的新手。我已经阅读了几本书,并花时间在这个网站上阅读Q& A的各种主题。我有一个测试项目正在运行以获得基础知识,查询组列表并将它们返回到一个简单的视图。我喜欢Repository模式的想法,并且已经尝试了实现它。一些注释......目前,我没有使用EF或Linq2Sql,但可能在将来。我不确定我是否会在GroupRepository中保留我的using语句,或者通过Try / Catch / Finally添加一些Dispose语句,因为我还需要一种管理异常的方法。
在我继续学习的过程中,只想对我当前的设置提出一些建议/批评。
Base.cs
namespace Test.Models
{
public class Base : IDisposable
{
protected string Connection
{
get
{
return System.Configuration.ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;
}
}
}
}
Group.cs
namespace Test.Models
{
public class Group
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
public DateTime Created { get; set; }
}
}
GroupRepository.cs
namespace Test.Models
{
public class GroupRepository : Base, IGroupRepository
{
public List<Group> GetAllGroups()
{
List<Group> groups = new List<Group>();
SqlDataReader reader;
using (SqlConnection conn = new SqlConnection(Connection))
using (SqlCommand cmd = new SqlCommand("GetAllGroups", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
Group group = new Group();
group.ID = reader.GetInt32(0);
group.Name = reader.GetString(1);
group.IsActive = reader.GetBoolean(2);
group.Created = reader.GetDateTime(3);
groups.Add(group);
}
}
return groups;
}
}
}
IGroupRepository.cs
namespace Test.Models
{
public interface IGroupRepository
{
List<Group> GetAllGroups();
}
}
GroupController
namespace Test.Controllers
{
public class GroupController : Controller
{
private IGroupRepository _repository;
public GroupController() : this(new GroupRepository())
{
}
public GroupController(IGroupRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
return View(_repository.GetAllGroups());
}
}
}
查看
@model IEnumerable<Test.Models.Group>
@{
ViewBag.Title = "Group List";
}
<table>
@foreach (var item in Model) {
<tr>
<td>
@item.ID
</td>
<td>
@item.Name
</td>
<td>
@item.IsActive
</td>
<td>
@item.Created
</td>
</tr>
}
</table>
全部谢谢!
答案 0 :(得分:1)
对于基础项目/学习这个很好。一旦开始进入更高级的场景,您会发现您在视图中显示的数据看起来不像它存储在数据库中的数据,您可能希望拥有特定于您的视图的模型,而不是直接从模型中返回模型。将您的存储库放入您的视图中。
这是你可以随时调整的,如果你只是做基本的操作,那就没关系。
另一件容易出现冗余的事情是在您的存储库中使用特定的数据访问方法。通常我尝试做的是构造一个查询对象并将其传递到存储库,该存储库执行查询然后返回结果。这有助于我避免每次想要获取一组新数据或通过一组不同的参数进行查询时重新定义IRepository契约。
除此之外,一切看起来都非常标准,并且通过存储库将数据访问与控制器分离的主要概念是可靠的。
这是一个(非常基本的)查询对象模式的示例实现(这只是为了给你一个想法,你会想要在开始使用之前清理它):
public class GroupQueryParams
{
public int? GroupId {get;set;}
public string GroupName {get;set;}
}
public class GroupRepository : Base, IGroupRepository
{
public List<Group> GetGroups(GroupQueryParams query)
{
var storedProcName = "GetAllGroups";
if(query.GroupId.HasValue)
storedProcName = "GetGroupById";
if(!string.IsNullOrEmpty(query.GroupName))
storedProcName = "GetGroupByName";
//setup a parameter collection here to pass into the command
List<Group> groups = new List<Group>();
SqlDataReader reader;
using (SqlConnection conn = new SqlConnection(Connection))
using (SqlCommand cmd = new SqlCommand(storedProcName, conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
Group group = new Group();
group.ID = reader.GetInt32(0);
group.Name = reader.GetString(1);
group.IsActive = reader.GetBoolean(2);
group.Created = reader.GetDateTime(3);
groups.Add(group);
}
}
return groups;
}
}
这样你就有了一个方法“GetGroups”,你可以根据需要更改查询参数和底层逻辑,但每次要添加新查询时都不必继续重新定义接口