使用数据库&建筑问题

时间:2015-08-12 21:16:36

标签: c# model-view-controller architecture

我正在开发一个Web应用程序(不是ASP.NET),我遇到了一个小的架构问题:

所以,我有两个班级可以与用户合作。

public class User
{
    public int Id { get; set; }

    public string Username { get; set; }

    public string Password { get; set; }

    // Other properties...
}

public class Profile
{
    public int Id { get; set; }

    public string PhotoUrl { get; set; }

    public string DisplayName { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public List<PostItem> Posts { get; set; }
}

我不得不拆分这些类,因为有一个功能允许您查看某个成员的个人资料,显然您不想从包含用户密码,名称和密码的数据库中检索数据。其他私人东西(尽管它没有在视图中显示)。所以我将这些数据存储在不同的表中:table Users 包含个人信息,而表 Profiles 包含公共数据(任何人都可以查看)。

但与此同时,为了不打破单一责任原则,我必须实现 UserRepository ProfileRepository 类检查,添加和其他东西。

他们来了:

  • 问题1:处理用户注册的代码现在变成了真正的地狱,我必须通过实例化两个存储库来检查两个不同表中是否存在具有特定用户名的记录。

  • 问题2:同样在您可以查看公共数据的页面上,需要显示最新的帖子,但这是另一个问题:我无法在一列中存储复杂的值,所以我必须在另一个表中存储帖子。这意味着我需要实现PostRepository,同时 Profile 类中的属性帖子是没用的(虽然我需要它来显示视图中的最新帖子),因为顺序检索您需要查看 UserRepository 中其他表的最新帖子,但它应由 PostRepository 处理。例如,评论也是如此。

所以,这是我的问题。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好的,依次拍摄每个项目;

1)通过一个存储库检查用户的标识并将其对应用程序的权限存储在另一个存储库中是完全正常的。实际上,这是联合身份背后的基本思想。考虑一下你可能扩展你的应用程序以允许Facebook提供身份,但是你自己的应用程序提供权限,你会发现将它们分开是有意义的。

2)是的,绝对的。是什么让你认为像Posts这样的大容量商店最好由同一个存储库提供服务,你可以存储低权限率的数据集,比如Permissions in?一个可能在Mongo中,另一个在Active Directory中,其中Identity是OAUTH。您可以看到,由于您自己的整个应用程序,您认为这些是不必要的复杂性,而它们代表了良好的架构分离。

身份=&gt;不属于您的申请。变化速度慢。 权限=&gt;由您的应用程序拥有。变化速度慢。 帖子=&gt;由您的应用程序拥有。快速改变愤怒。

只看这三个用例,似乎使用不同的存储库是一个好主意,因为它们具有不同的配置文件。如果最终您的存储库都映射到SQL Server(或其他)实现,那么就这样吧;但是通过在架构上分离这些,你可以使用最好的底层实现。