我正在MVC中编写一个项目并使用EF 4.0。我正在使用存储库模式但不确定在哪里放置一些属性。
public interface IUserRepository<User>
{
User GetUserById(int userId);
void UpdateUser(User user);
void AddUser(User user);
List<User> GetUsersByName(string userName);
void Create(User user);
int NumberOfFollowers { get; set; }
}
我的两个问题是1)。属性NumberOfFollowers
应该是属性还是方法?
和2)。它应该放在User实体类而不是接口吗?
欢呼声。
答案 0 :(得分:4)
如果NumberOfFollowers
是用户的属性,它肯定应该在User
类,而不是存储库。存储库负责获取/放置数据。
这是我最喜欢的EF存储库实现:
http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx
这个非常棒,非常完整,并且具有很多功能。
答案 1 :(得分:1)
NumberOfFollowers将是User本身的属性,而不是存储库接口。
善,
丹
答案 2 :(得分:1)
re:属性或方法,.NET Design Guideless规定它不应该是属性,如果它可以a)抛出和异常或b)花费相当多的时间返回。
答案 3 :(得分:0)
我同意丹尼尔的回答 - 拥有一个名为NumberOfFollowers
的财产是最符合逻辑的。作为指南,如果有可以通过User
对象本身访问的数据,则直接在User
类上创建属性\方法。如果你有其他表的foregin键,那么访问这些数据项可以通过User
类完成,并且应该封装在properties \ methods中。
另一方面,如果您想查找与User
相关的信息,但需要其他对象的帮助,则创建一个UserService
类。保持存储库简单 - 只有数据检索\操作方法,并在单独的服务类中创建更多涉及/业务逻辑的方法,例如。
public class UserService {
private DbContext Context {get; set;}
public IList<Document> GetUserDocument(User user)
{
// Assuming User table does not have a Document ID as a foregin key..
// Do whatever you need to do to get document.
} }
以上是粗略的指南,绝不是事实上的标准,但对我来说效果很好。
答案 4 :(得分:0)
我写了一篇关于它的blog,并介绍了如何抽象ORM提供程序特定功能,每个请求对象上下文管理,从多个数据库管理模型,具有完整源代码和示例的工作单元模式的事务管理。
如果您有任何疑问,请查看并告诉我。