我正在使用我的mvc4网站的通用存储库和工作单元模式。
现在我遇到了这种情况,我想要删除系统的用户。 在删除代码中,我必须删除其他表中的更多条目(注释,访问权限等)。
最简单的解决方案是创建一个继承自UserRepository
的{{1}}并修改delete方法以删除其他表中的数据。但这意味着我的GenericRepository<User>
将访问其他表,这些表应该有自己的存储库类,对吧?
我读过一个服务层,它位于我的业务逻辑和我的存储库之间。
这里的最佳做法是什么,以及如何看待服务层的实现?
如果我使用服务层,或者我是否只有通用存储库并在服务类中执行逻辑,是否仍然需要自定义实现的存储库,如UserRepository
?
示例代码:
UserRepository
答案 0 :(得分:4)
使用DDD(域驱动设计)运动推广了存储库模式。在DDD中,建议您不要为每个表创建一个存储库,而是每个聚合根创建一个存储库..因此,虽然您可能有用户,用户订单和用户注释的表,但您可以确定用户是聚合根,然后您只需创建一个用户存储库并在那里添加您的方法。
无论如何,无论你是否关心DDD,我都会将逻辑添加到你的用户仓库中,在那里而不是任何其他仓库是有意义的。
你可以创建一个服务层并为此创建一个服务类,但服务类对此并没有用 - 在这种情况下你并没有真正受益。
答案 1 :(得分:2)
使用
.WillCascadeOnDelete(true);
on modelBuilder
回答有关服务的问题。理想情况下,您希望服务在存储库为您检索的实体/对象上执行其他逻辑。在这种情况下,您实际上并不希望服务删除行,因为这是您的存储库的责任。
服务很好。在MVC中,您可以从控制器中调用服务方法。理想情况下,接口可以让您轻松测试它们。
答案 2 :(得分:0)
正如您所说,服务层可以帮助您分离业务逻辑和存储库。这里的主要思想是依赖注入
public interface IUserService
{
public void Delete(User entity);
}
//
// This class would be used Linq to Entities
public class LinqUserService : IUserService
{
public void Delete (User entity)
{
}
}
//
// This class would be used Sql command
public class SqlUserService : IUserService
{
public void Delete (User entity)
{
}
}