存储库模式和服务层实现

时间:2013-05-28 21:00:38

标签: c# asp.net-mvc-4 repository-pattern

我正在使用我的mvc4网站的通用存储库和工作单元模式。

现在我遇到了这种情况,我想要删除系统的用户。 在删除代码中,我必须删除其他表中的更多条目(注释,访问权限等)。

最简单的解决方案是创建一个继承自UserRepository的{​​{1}}并修改delete方法以删除其他表中的数据。但这意味着我的GenericRepository<User>将访问其他表,这些表应该有自己的存储库类,对吧?

我读过一个服务层,它位于我的业务逻辑和我的存储库之间。

这里的最佳做法是什么,以及如何看待服务层的实现?

如果我使用服务层,或者我是否只有通用存储库并在服务类中执行逻辑,是否仍然需要自定义实现的存储库,如UserRepository

示例代码:

UserRepository

3 个答案:

答案 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)
    {
    } 
}