複数のサービスレイヤオブジェクトは、DAOを共有するべきでしょうか?

StackOverflow https://stackoverflow.com/questions/900279

  •  23-08-2019
  •  | 
  •  

質問

私はPortalAccountオブジェクトが含まれている連絡先のクラスを持っています。私は連絡先の「ポータルアカウント」を作成したい場合は、アカウントは石鹸/軸を使用して、ポータルアプリケーションにリモートで作成し、連絡先のportalAccountは人口で、連絡先が保存されている(ローカルデータベースは次のように、リモートのアカウントに関する情報を保持していますユーザーIDとユーザー名、など)。

だから私は実際にContactインスタンス特定のリモートポータル上のユーザーを作成するためのメソッドを持っているサービスクラスPortalServiceImplを持っています。

この情報のすべてを考えると、私の質問は次のようになります。PortalServiceImplはContactDAOオブジェクトのインスタンスを取得し、実際に保存を行う、またはPortalServiceImplクラスだけで、リモート・ユーザを作成して、連絡先オブジェクトに渡され、変更、および聞かせなければならない必要がありますクライアントは、節約のために責任がある?

方法1:

class ServiceFacadeImpl {
  public void createPortalAccount(Contact contact) {
    // here the contact is implicitly saved
    this.portalService.createPortalAccount(contact);
  }
}

方法2:

class ServiceFacadeImpl {
  public void createPortalAccount(Contact contact) {
    // here contact is implicitly modified
    this.portalService.createPortalAccount(contact);
    this.contactDAO.save(contact);
  }
}

どちらの方法も、私には間違っている感じ。 PortalServiceは(DAOインタフェースを介してとはいえ)、リモートユーザーを作成し、データベースへの接触を保存しているので、方法1は、間違って感じています。私はPortalServiceが、私はそれに渡している連絡先を変更していることを前提としなければならないので、方法2は間違って感じています。

また、私は潜在的に一貫してトランザクションを処理していないように、他のいくつかの落とし穴を見ていないよ感じています。

(ところで、私はすでに両方の方法を使用しました、そして無限のサークルにリファクタリングを継続する必要はありません。何かがちょうどここに間違っているようです。)

役に立ちましたか?

解決

あなたはそれはあなたがローカルおよびリモートで別の連絡先IDを持ってよいでしょうか?それは私には間違っているようだが、多分私はちょうどあなたのドメインを知りません。

私のアプリケーションでは、すべての新しい連絡先は、リモートポータルにWebサービスを介して送信され、そこに保存されます。私はローカルで新しい連絡先を保存するときに、それがリモートポータルに送られ、そこに保存されました。たぶん、あなたは同じことを必要とする?

上記の考えはあなたのために受け入れられない場合、私はこのようにそれを行うだろう。

class ServiceFacadeImpl {
  public void CreatePortalAccountAndSaveContact(Contact contact) {
    try
    {
      contact.portalAccount = this.portalService.createPortalAccount(contact);
      this.contactDAO.save(contact);
    }
    catch(...)
    {
      // do cleanup, for example do you need to delete account from remote 
      // portal if it couldn't be saved locally?
      // If yes, delete it from portal and set contact.portalAccount = null;
    }
  }
}

いくつかは、単一責任の原則を破るCreatePortalAccountAndSaveContactいる、と言うかもしれないが、私は理解して、あなたがアトミックであることを、この操作を必要とする、ため、IMOこのような状況では、それは絶対に普通のことです。右?

それとも、あなたが連絡先を保存するかどうかを示す、方法にブール値のフラグを追加することができます。しかし、あなたは常にまっすぐリモートポータルからそれを取得した後PortalAccountとの接触を保存する必要がある場合 - その後、ブールフラグは必要ありません。

PS。なぜあなたは「この」キーワードを使用していますか? portalServiceプライベートメンバはありますか? yesの場合は、多分あなたは、例えば、「_」プレフィックスであなたの命名規則と名前のプライベートメンバーを再考する必要があります(私はそれが最も人気の一つだと思います)、_portalServiceのように - _portalServiceがプライベートメンバーであることを理解するのは容易になります。 offtopicのため申し訳ありません。

幸運ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top