繁体   English   中英

存储库模式和服务层实现

[英]Repository pattern and service layer implementation

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

现在,我想删除系统用户。 在删除代码中,我必须删除其他表中的其他条目(注释,访问权限,..)。

最简单的解决方案是创建一个从GenericRepository<User>继承的UserRepository ,并修改delete方法以删除其他表中的数据。 但这意味着我的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);
    }
}

存储库模式随着DDD(域驱动设计)运动而流行。 在DDD中,建议您不要为每个表创建一个存储库,而不要为每个聚合根创建一个存储库。因此,尽管您可能有一个用于用户,用户订单和用户注释的表,但您可以确定该用户是聚合根,然后您将只创建一个用户存储库并在其中添加您的方法。

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

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

采用

.WillCascadeOnDelete(true);

modelBuilder

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

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

如您所说,服务层可帮助您在业务逻辑和存储库之间进行区分。 这里的主要思想是依赖注入

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM