1

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

现在我有一种情况,我想删除我系统的用户。在删除代码中,我必须删除其他表中的更多条目(评论、访问权限、..)。

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

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

这里的最佳实践是什么?服务层的实现看起来如何?

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

示例代码:

class UserRepository
{
    public void Delete(User entity)
    {
        var userComments = Context.UserComments.Get(comment => comment.UserId == entity.Id);

        foreach (var comment in userComments)
        {
            Context.UserComments.Remove(comment);
        }

        //
        // same for access rights here
        //

        Context.Users.Remove(entity);
    }
}
4

3 回答 3

4

存储库模式随着 DDD(领域驱动设计)运动而普及。在 DDD 中,建议您不要为每个表创建一个存储库,而是为每个聚合根创建一个存储库。因此,虽然您可能有一个用于用户、用户订单和用户评论的表,但您可以决定用户是一个聚合根,然后您只需创建一个用户存储库并在那里添加您的方法。

无论如何,无论您是否关心 DDD,我都会将逻辑添加到您的用户存储库中,在那里而不是任何其他存储库是有意义的。

可以为此创建一个服务层并创建一个服务类,但服务类对此实际上没有用 - 在这种情况下您并没有真正受益。

于 2013-05-28T21:11:22.867 回答
2

利用

.WillCascadeOnDelete(true);

modelBuilder

回答您有关服务的问题。理想情况下,您希望您的服务对存储库为您检索的实体/对象执行附加逻辑。在这种情况下,您并不真正希望服务删除行,因为这是您的存储库的责任。

服务很好。在 MVC 中,您从控制器调用服务方法。理想情况下,接口使您可以轻松地对其进行测试。

于 2013-05-28T21:09:03.537 回答
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)
    {
    } 
}
于 2013-05-28T21:09:57.983 回答