gpt4 book ai didi

asp.net-mvc - 仍然迷失在存储库和解耦,ASP.NET MVC

转载 作者:行者123 更新时间:2023-12-04 15:15:37 25 4
gpt4 key购买 nike

我仍在不断地寻求构建(和理解)解耦、IoC、DI 等的现代编程约定。我正试图弄清楚如何构建存储库。我查看了 Database abstraction layer design - Using IRepository the right way? 的帖子这非常有帮助,但我仍然有一些问题一直让我感到困惑。
我的程序现在有 4 层...

Web (Project | ASP.NET MVC Application) - References Models.dll and Persistence.dll

Models (Domain Objects)

Persistence (Fluent nHibernate Mapping of Domain Objects)

Utilities (Providers, Repositories)


现在,我正在尝试编写一个简单的成员(member)存储库。我的第一个任务……?
当有人尝试注册时,检查是否存在电子邮件地址。这看起来一切都很好——所以我去尝试找出把它放在哪里。
不过,起初我只是将它放在 MembershipProvider 中。类(class) CreateUser方法。然而,这存在于 Utilities 项目中。到目前为止,Utilities 还没有关于 nHibernate 的知识。只有 Persistence Project 对 nHibernate 有任何了解。
那么,我的 CreateUser方法需要查询我的数据库。那么这里的最佳做法是什么?我创建一个 UserRepositoryPersistence项目,只需创建一个名为 CheckEmail 的完整方法?还是我只是将 nHibernate .dll 添加到我的 Utilities项目,并在提供者中编写 session 查找?
好像是 更多 努力在我的持久性项目中创建存储库,这些存储库执行特定操作而不是创建提供程序。如果我必须为他们制作存储库,我为什么还要制作提供者?所有这些新方法的目的不就是停止代码重复吗?但感觉就像让事情“分开”一样,我必须编写相同的代码 2 或 3 次。这里的最佳做法是什么?

最佳答案

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

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

针对jfar的疑问:

没错,域定义了可以做什么,定义接口(interface)如Domain.IUserRepository.Create(User user) .然而,该域没有定义任何实现。

假设您开始使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com