我仍在永恒的追求中,以构建(并理解)去耦,IoC,DI等的现代编程约定。我正在尝试找出如何构建存储库的那一部分。我已经检查了Database abstraction layer design - Using IRepository the right way?上的帖子,该帖子非常有帮助,但是我仍然遇到一些问题,这些问题一直困扰着我。
我的程序现在分为4层...

现在,我正在尝试编写一个简单的成员资格存储库。我的第一项任务...?
当有人尝试注册时,请检查是否存在电子邮件地址。看起来一切都很好,所以我去尝试找出放置位置。
不过,起初,我只是将其放置在MembershipProviderCreateUser方法的内部。但是,这驻留在实用程序项目中。到目前为止,Utilities还不了解nHibernate。只有Persistence Project具备nHibernate的任何知识。
因此,我的CreateUser方法需要查询我的数据库。那么,这里的最佳实践是什么?我是否要在UserRepository项目中创建Persistence,并仅创建一个称为CheckEmail的完整方法?还是仅将nHibernate .dll添加到我的Utilities项目中,然后在提供程序中编写 session 查找?
似乎要做的更多工作是在我的持久性项目中创建执行特定操作的存储库,而不是创建提供程序。如果必须为他们创建存储库,为什么还要创建提供商?所有这些新方法的目的不是停止代码重复吗?但是感觉要保持“分离”,我必须编写相同的代码2到3次。这里的最佳做法是什么?

最佳答案

您的存储库应确实在Persistence程序集中实现。假设您正在对它们进行单元测试,则将为Domain程序集中的每个存储库定义接口(interface)。

您的CreateUser方法不应直接查询数据库以确定电子邮件地址是否已存在,而应在DoesEmailExist中创建一个单独的方法来执行该检查。每种方法应具有单一职责。

针对jfar的疑问:

是的,该域定义了可以完成的工作,并定义了诸如Domain.IUserRepository.Create(User user)之类的接口(interface)。但是,该域未定义任何实现。

假设您开始使用Entity Framework,可以创建一个Persistence程序集,该程序集实现域中定义的接口(interface)。因此,从上面的域接口(interface)开始,我们实现该接口(interface):

namespace Persistence
{
    public class UserRepository : Domain.IUserRepository
    {
        public void Create(User user)
        {
           // use Entity Framework to persist a user
        }
    }
}

例如,假设您的客户后来告诉您实现NHibernate持久层。幸运的是,我们的域与现有的持久层是分开的-它在域中。因此,您可以轻松实现现有域接口(interface),而无需更改MVC应用程序中的任何代码-所知道的只是您定义的接口(interface),而不是Entity Framework实现。

然后,您可以将IoC容器配置为将IUserRepository解析为Entity Framework还是NHibernate实现,而您的MVC应用程序则不在乎。

在程序集引用方面,Persistence程序集引用了Domain,而Domain恰好没有引用Persistence

这导致了一种分离的设计,该设计易于测试,并且日后可以进行更改,从而使维护更加容易。

希望对您有所帮助。

关于asp.net-mvc - 仍然在存储库和解耦中丢失,ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4390489/

10-12 00:28
查看更多