难道是双重的工作创建数据访问组件和业务组件?
-
26-09-2019 - |
题
我设计我的第一分层的应用,其由数据,商业的和表示层。
我的业务组件(例如,Business.Components.UserComponent)目前有以下方法:
public void Create(User entity)
{
using (DataContext ctx = new DataContext())
{
ctx.Users.AddObject(entity);
ctx.SaveChanges();
}
}
我喜欢这个设计。不过,我遇到了一些在线的例子,将推荐以下实现:
public void Create(User entity)
{
// Instanciate the User Data Access Component
UserDAC dac = new UserDAC();
dac.InsertUser(entity);
}
这将导致对于所有的实体创建数据访问组件,每个包含的基本方法(创建,编辑,删除...等)。
这似乎是双重的工作,因为我必须与基本方法创建数据访问组件以及业务组件,只是简单地调用数据访问组件的方法。
什么会被视为正确实施的分层应用基本的CRUD功能的最佳实践?它们应该是在业务组件或“编码”数据访问组件?
解决方案
这取决于。如果你希望你的业务层根本就CRUD操作比你可以按照你的初步做法。如果你打算使用一些大的商业逻辑在那里的业务组件将与许多实体工作第二种方法比较好。
人们之所以喜欢用第二种方法是测试和持久性的无知。如果使用第一种方法你的业务组件紧密结合实体框架。嘲讽的ObjectContext不是很容易的任务,以便测试是很难的。如果使用第二种方法你的业务层是独立的持久化层上。您可以轻松地测试它,你甚至可以持久化层改变,如果你需要。但是,这些都是你很可能不是现在寻找更高级的概念。您的代码将需要一些额外的改进是可测试的。
DAC还可以实现为存储库。有很多方法如何创建通用的存储库,以便你只有一个类实例化你仓库时,定义实体类型:
var repository = new GenericRepository<User>();
另外要注意,使用单独的数据访问层引入了新的复杂性,因为有时可以合理地共享多个储存库之间单一上下文。这与一些被称为工作模式的单元一起来到。
有大量的关于在互联网上实施的工作模式库和单位文章。我把一部分储存在家里,所以如果你有兴趣以后我可以包括他们我的回答收藏夹。
不隶属于 StackOverflow