尽管谷歌搜索了很多,但我找不到明确的答案。
我试图尽可能地应用“SOLID”并尝试使用常识并避免使用模式,当我看到模式产生的问题多于它试图解决的问题。我不想应用模式并让生活很难让其他人使用我的代码只是为了“我写模式”,如果你看到我的意思..
现在我正在努力解决我认为最容易掌握“SRP”的原则之一
您如何将此原则实际应用于存储库?
假设我有一个
通常他们会有像这样的方法
public interface IUserRepository
{
User GetUser(int id);
IEnumerable<User> GetAllUser();
void DeleteUser(int id);
}
员工和产品也一样。
我们是说这些方法中的每一种都应该是一个类吗?即使有时我们正在谈论一行代码?
任何地方的任何建议或示例应用程序都将非常感激。
非常感谢答案 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
答案 3 :(得分:0)
我想说这取决于您为“单一责任”设置范围的位置。在我看来,你可以说:
每个存储库都只负责管理一种类型的实体。这意味着UserRepository
中的所有方法都应该与User
实体相关,而不是与其他实体(如产品)相关。这意味着您UserRepository
中的任何方法都不应该像GetProducts
或类似的东西。
存储库中的每个方法也应该承担单一责任。这意味着每个方法只应处理一个特定的情况(如创建,删除等......)。
通过这种方式,您仍然可以实现SRP原则(取决于其周围的上下文),而无需为每个函数创建一个类(在我看来,这看起来有点矫枉过正)。