オニオンフレームワークでは、外側のレイヤーはすべての内側のレイヤーにアクセスできます。私がこれを行うと、私の外層(MVCのUIレイヤー/コントローラ)はアプリケーション/ビジネスサービスとリポジトリに直接アクセスできます。今、私のコントローラは、ドメインモデルを作成し、それをリポジトリを使ってデータストアに保持することができます。したがって、ビジネスレイヤーで書かれた検証やその他のビジネスルールをバイパスします。私は何かが欠けていると信じています。助けてください。 http://jeffreypalermo.com/blog/the-onion-architecture-part-2/オニオンフレームワーク:UI /コントローラはリポジトリに直接アクセスする必要があります
0
A
答えて
1
から
public SpeakerController(IConferenceRepository conferenceRepository,
IUserSession userSession, IClock clock)
: base(userSession) {
_conferenceRepository = conferenceRepository;
_clock = clock;
_userSession = userSession; }
私はパレルモ自身がTwitterの会話に特に示されていても "ノー" と言います。私は、各レイヤーが次の内部レイヤーと対話し、それをバイパスすることは許されていないと言います。問題の機能が基本的に参照データのCRUDだけである場合は、このルールの例外です。この種のデータに複雑さを追加する理由はありません。
また、リポジトリ実装でビジネスルールの検証を強制することもできます。実装はタマネギの最外層にあるので、これは非常に簡単です。
私はAlistair CockburnのHexagonal Architectureが玉ねぎのアーキテクチャよりも明るくてシンプルであることを発見しました。基本的には「アプリケーションの内側」と「アプリケーションの外側」です。その境界線を越える必要があるときはいつでも、アプリケーションを実装の詳細から保護するためのアダプタが必要です。
関連する問題
- 1. ScalaSignatureを直接使用する必要がありますか?
- 2. リポジトリは別のリポジトリを呼び出す必要がありますか?あるいは、リポジトリがサービス層を呼び出す必要がありますか?
- 3. サーバー側のコンポーネントを持つAndroidアプリはFacebookに直接アクセスする必要がありますか?
- 4. intに直接アクセスするか、getterからdoubleを取得してキャストする必要がありますか?
- 5. リポジトリにUnitOfWorkを実装する必要がありますか?
- 6. IIS仮想サーバーリレーまたはSMTPサーバーに直接接続する必要がありますか?
- 7. ドメインモデルオブジェクトでlog4netを直接使用する必要がありますか?
- 8. サービス層はHttpContextにアクセスする必要がありますか?
- 9. リポジトリ構造を変更する必要があります
- 10. コントローラ(MVC)をテストする必要がありますか?
- 11. エンティティ名はエンティティ参照の '&'の直後にある必要があります
- 12. チェックボックスにアクセスする必要があります
- 13. dotnetnukeでデータベースにアクセスする必要があります
- 14. SimpleXMLオブジェクトの値にアクセスする必要があります
- 15. クッキークロスウェブサイトにアクセスする必要があります
- 16. 2つのデータベースにアクセスする必要があります
- 17. UITextFieldのコントローラを作成する必要はありますか?
- 18. コントローラからjsonデータを返す必要がありますか?
- 19. Angularjsで直接コントローラとスコープと対話する方法はありますか?
- 20. AVCaptureVideoPreviewLayerを書き直す必要がありますか?
- 21. golangでServeMuxまたはhttpを直接使用する必要があります
- 22. Pythonで直接ハードウェアにアクセスする方法はありますか?
- 23. UIスレッドでマーシャリングされたメソッドはスレッドセーフである必要があります
- 24. mysql_close(接続)を使用する必要がありますか?
- 25. PHPでデータベース接続する必要がありますか?
- 26. データ接続を模擬する必要があります
- 27. 「ベース」を使用する必要があります。接頭
- 28. ライブラリファイルとメディアファイルをリポジトリに保存する必要がありますか?
- 29. servstructor内からlocalstorageまたはcookieにアクセスする必要があります
- 30. コントローラ名はcodeigniterのファイル名と一致する必要がありますか?
私はあなたが正しいと言えば、CRUD操作のビジネスクラスにラッパー/パススルーメソッドを持たせる必要はないということです。 UIでリポジトリメソッドを使用することはOKです。私にとって、リポジトリの「ビジネスルールの検証」は良い考えではありません。これは、ビジネス層を持つという目的を打ち破ります。 – Pragmatic
参照データと検証という2つの異なる問題があります。私は別のコメントでそれらを処理します。 Re:参照データ StateOrProvinceというテーブルがあります。私は、このデータのための必須のフィールドと一意性以外のビジネスルールはないかもしれません。これらの規則は、データベースによって実施することができます。このデータにはCRUD以外の操作はありません。この種のデータのドメインモデルを開発することは過度のことかもしれません。私は通常、この場合、ORMに自分のビューを直接バインドします。 –
Re:Validation ドメイン層に検証ロジックを記述します。ドメインオブジェクトで使用できるドメインレイヤーで定義された永続レイヤーを表す抽象概念が必要です。永続性レイヤの実装でドメインオブジェクトの検証ロジックを '呼び出す 'ことができない理由はありません。事実、OAダイアグラムを注意深く見れば、ダイアグラムの最も外側のラングの1つにパーシスタンスの実装があります。つまり、パーシスタンス層のドメインの完全なコンテキストを取得できます。あなたもそれを使うかもしれません。 –