1

さて、DomainObject/Modelとオブジェクトを呼び出し$userまし$userDAOた。

これまで読んだことから、$userオブジェクトのフェッチなどのCRUD操作を実行する必要がある場合は、次のようにします。

$user = $userDAO->fetchById($userId);

そしてそれは私のオブジェクトを返し$userます。

どうやらDomainObjectはDAOオブジェクトが存在することを認識していないはずであり、その逆も同様ですが、ユーザーが登録していて$user->register()メソッドを実行した場合はどうなりますか?

$user->register($firstName, $lastName, $emailAddress, $username, $password etc.);

その方法のどこかで、選択したユーザー名がすでに使用されており、電子メールアドレスと同じであるかどうかを確認する必要があります。

これを行うことを考えることができる唯一の方法は、$userDAOオブジェクト内に$userオブジェクトのインスタンスを持ち、次のような検証を行うことです。

if($this->userDAO->isUsernameTaken($username)) {
    // the username is already in use
}
else {
    // continue on
}

しかし、それはDomainObjectがデータベースのものについて知らないはずであるという規則を破るでしょう、そしてその逆も同様ですが、すべてのクエリがDAOオブジェクトにあるので、DomainObjectはデータベースのものについて実際には知らないと思っていました。オブジェクトですが、そのオブジェクトで何が起こっているのかを明示的には知りません。私は正しいですか、それとも間違っていますか?

間違った方法で実行している$user->register()場合、データソースにアクセスする必要があるデータベースクエリを呼び出す必要があるようなメソッドを実行する方法を教えてください。ただし、DomainObject / Modelはデータソースについて知ることができないため、専門家は言う?

私は今日Googleのページ番号に行きましたが、行く必要はないと思っていましたが、実際に何をすべきかについての非常に堅実な例を見つけることができず、すべてが遅くなっているために怒り始めています。

どんな助けでもいただければ幸いです。ありがとう。

4

1 に答える 1

3

階層化アーキテクチャの観点からアプリケーションのアーキテクチャを考える場合、ドメイン層とDAO層の上に別の層を構築し、これら2つの層をそのままにしておく必要があります。この新しいレイヤーは、サービスレイヤーまたはアプリケーションレイヤーと呼ばれることもあります。このサービスレイヤーの役割は、新しいユーザーの「登録」などのユースケースを実行することです。たとえば、サービスレイヤーの1つのクラスは、ユーザーに関連するユースケースを実行するUserServiceである可能性があります。

class UserService {

private UserDao userDao;

// constructor
userSercie(){

}

// registers a user
register($firstName, $lastName, $emailAddress, $username, $password etc.) {
    $user = $userDAO->fetchByName($username);
    if($user != null) {
         // the username is already in use
    }
    else {
       // continue on
    }

   }

 // other service methods such as


}

なぜサービスレイヤーが必要なのですか?サービスレイヤーが必要なのは、まさにあなたのような問題に対応するためです。このようにして、異なるモジュール間で関心の分離を維持できることがわかります。

于 2013-01-02T17:24:28.773 に答える