- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
正如标题所暗示的,我在实现 3 结构模型(域对象、数据映射器和服务)时遇到了一些小问题。
过去,当有人在我的网站上注册时,我会简单地做
$user->register($firstName, $lastName, $emailAddress, $username...);
并且该方法将按这样的步骤运行
1. Check if the form sent was valid.
2. Check if all the required fields were filled.
3. Check the if the lengths of strings were valid and the range of integers etc.
4. Check if the input is in the correct format (regex).
5. Check if the username is already taken and if the email address already exists
in the database
6. etc. etc.
一切正常,但我正试图摆脱这种方式,因为我希望我的代码更具可重用性和可测试性。
现在,有了这 3 个结构模型,域对象和数据映射器应该通过服务进行通信,以保持它们彼此隔离,所以这是我对用户服务的想法
class UserService {
public function register($firstName, $lastName, $email...) {
$userDO= $this->domainObjectFactory->build('User');
$mapper = $this->dataMapperFactory->build('User');
// Is this where I start doing my validation like in the steps above???
// And if this is where I start doing my checks, when I get to the part
// where I have to check if the username they want is already taken how
// how do I do that check?
}
}
然后为了实际运行,我会像这样从我的 Controller 中执行
$userService = $this->serviceFactory->get('user');
$result = $userService->register($_POST['firstName']....);
逻辑(if 和 else 的)必须在我的 UserService
类中的 register()
方法中,对吗?因为如果他们在我到达需要数据库做一些检查的阶段时进入域对象,比如用户名是否已经存在,我将如何访问数据库?我真的不知道,因为域对象不应该知道有关数据源的任何信息。
必须有一种方法来访问数据库以进行小查询,例如检查用户名或电子邮件地址是否已经存在以及需要完成的其他小查询负载。
我有很多实体/域对象需要执行大量小查询,过去我的模型可以从任何方法访问数据库并且可以执行这些查询,但这似乎不允许这样做3 结构模型,我非常想知道什么是正确的方法,因为必须有一种方法。
我一直在飞行,直到我发现一个模型是一个分为 3 个结构的层。
任何帮助或插入正确的方向将不胜感激,尤其是现实生活中的好例子。互联网似乎缺少针对我的特定问题的信息。
谢谢。
最佳答案
我正在经历与你现在相同的事情(有趣的是,对于这个确切的问题 - 用户注册/授权)。
我的一条建议是,您不应将模型限制为仅 3 层(在本例中为 3 个类)。一个模型应该包含尽可能多的类,以便在保持 SRP(单一责任原则)完整性的同时完成工作。
例如,您可能还想使用 UserTableGateway 类来补充 UserDataMapper,并使用 UserCollection 类来允许潜在的分页功能或一般用户列表。所有这些都可以成为您的模型和 UserService 层的一部分。
要回答您有关注册过程特定逻辑的问题,是的,最合适的地方是在 UserService 类的注册方法中。
综上所述,您可能想在这里考虑一下您的域结构。 UserService 是否是最适合注册的地方(以及通过扩展、登录、恢复密码、更改密码等)?
也许这些东西可能是与帐户相关的完全不同模型的一部分。服务类可能是这样的:
class Account
{
// Think of this as AccountService, it will have a number of collaborators,
// including an Authenticator class for loggin in, a Session class for managing the session
// and of course various persistence classes for storing the user, session and credentials
public function register(UserInterface $user) {}
public function login($email, $password) {}
public function logout(UserInterface $user, $session_id) {}
public function changePassword($user_id, $old_password, $new_password) {}
public function recoverPassword($user_id, $email) {}
}
鉴于 UserService 可能负责许多其他事情,将与用户帐户相关的所有内容都保留在它自己的服务类中是有意义的。
从概念上讲,无论如何,帐户与用户是不同的,如果在概念上有所不同,它就应该有自己的类别。
现在,就让 Account 服务类获得它所需的依赖项而言,这超出了我对复杂系统设计的理解。
关于php - 实现 3 结构模型(域对象、数据映射器和服务)的一些不确定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14143690/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!