单一责任原则和知识库

时间:2014-11-02 17:34:06

标签: c# design-patterns repository-pattern solid-principles

尽管谷歌搜索了很多,但我找不到明确的答案。

我试图尽可能地应用“SOLID”并尝试使用常识并避免使用模式,当我看到模式产生的问题多于它试图解决的问题。我不想应用模式并让生活很难让其他人使用我的代码只是为了“我写模式”,如果你看到我的意思..

现在我正在努力解决我认为最容易掌握“SRP”的原则之一

您如何将此原则实际应用于存储库?

假设我有一个

  1. IEmployeeRepository
  2. IUserRepository
  3. IProductRepository
  4. 通常他们会有像这样的方法

    public interface IUserRepository
    {
        User GetUser(int id);
        IEnumerable<User> GetAllUser();
        void DeleteUser(int id);
    }
    

    员工和产品也一样。

    我们是说这些方法中的每一种都应该是一个类吗?即使有时我们正在谈论一行代码?

    任何地方的任何建议或示例应用程序都将非常感激。

    非常感谢

4 个答案:

答案 0 :(得分:2)

如果您很难确定单一责任模式的限制,那么您可以去寻找不使用SRP的类的明显示例。例如,一个为用户实现业务规则以及配置用户数据库备份的类,并且还通过一些特殊的日志记录到它公开公开的文件,因为它是一个相当简洁的hack。你绝对应该避免这种情况。

您似乎能够一直应用SRP以便每个方法可以进入单独的类的原因之一可能是因为您有 Anemic Domain Model 。也许您的应用程序只是在数据库之上公开CRUD操作,并且您的应用程序中没有实现真正的业务规则?

在任何情况下,它都没有应用SRP将UserRepository拆分为每个方法的类,但是你甚至得到这个想法可能表明UserRepository在你的架构中没有任何用途

答案 1 :(得分:1)

对于基本的CRUD操作,通常使用通用存储库:

public interface IRepository<T>
{
   T Get(int id);
   IEnumerable<T> GetAll();
   T Update(T item)
   void Delete(int id);
}

或类似的。然后你的具体实现可以从一个基础继承。

答案 2 :(得分:0)

这可能取决于抽象程度。

//具有某些行为的对象:持久性模型+行为 Class Cat { string Name {get;set;} void Meov(){...} }

//具有某种行为的对象

SomeRepository:ISomeRepository{
User GetUser(int id);
IEnumerable<User> GetAllUser();
void DeleteUser(int id);

}

这很有意思:) http://www.martinfowler.com/bliki/AnemicDomainModel.html

https://blog.inf.ed.ac.uk/sapm/2014/02/04/the-anaemic-domain-model-is-no-anti-pattern-its-a-solid-design/

答案 3 :(得分:0)

我想说这取决于您为“单一责任”设置范围的位置。在我看来,你可以说:

  • 每个存储库都只负责管理一种类型的实体。这意味着UserRepository中的所有方法都应该与User实体相关,而不是与其他实体(如产品)相关。这意味着您UserRepository中的任何方法都不应该像GetProducts或类似的东西。

  • 存储库中的每个方法也应该承担单一责任。这意味着每个方法只应处理一个特定的情况(如创建,删除等......)。

通过这种方式,您仍然可以实现SRP原则(取决于其周围的上下文),而无需为每个函数创建一个类(在我看来,这看起来有点矫枉过正)。