2016-11-03 2 views
1

これは、作業単位、リポジトリ、およびSimple Injectorを使用したサービスを使用したデータの永続化に関する初心者の質問です。リポジトリがIUnitOfWorkAsyncを要求し、サービスがRepository<>を要求した場合、それを呼び出すサービスレイヤまたはコントローラレイヤのどちらからUnitOfWork.Save()?に呼び出すのですか?Simple Injector for Dependency Injectionを使用して、Unit Of Workオブジェクトを参照してデータを保持する方法を教えてください。

私はSingleton Unit Of Workを作成してサービスレベルで作業単位への参照を求めることができますが、異なるコントローラではデータを別々に保存する必要があるため、これをしたくありません。 。(私もサービスでIUnitOfWorkAsync参照を取得しようとしたが、それは別の目的であったとのSaveChangesは効果がなかった

私はシンプルインジェクタとこれらを登録しました:

container.Register<IUnitOfWorkAsync, UnitOfWork>(Lifestyle.Scoped); 
container.Register(typeof(IRepositoryAsync<>), typeof(Repository<>)); 
container.Register(typeof(IHelpService), typeof(HelpService)); 

これは私のリポジトリと私のサービスです:

// For each repository like CustomerRepository, OrderRepository 
// additional comma separated parameters to the HelpService as necessary 
public Repository(IDataContextAsync context, IUnitOfWorkAsync uow) 

public HelpService(IRepositoryAsync<HelpTopics> repository) : base(repository) { } 

答えて

1

リポジトリはIUnitOfWorkAsyncを要求し、サービスがリポジトリ<>を要求した場合は、いずれかのサービスリットルからUnitOfWork.Save()を呼び出す方法? ayerまたはそれを呼び出すControllerレイヤー?

コントローラーにSaveを呼び出させたくないのは、これが責任ではないためです。サービスがSaveメソッドにコールされないようにしてください。これにより、コードの重複が発生し、Saveを忘れやすくなります。

解決策は、作業単位を保存できるサービスとコントローラの両方に不可視な中間層を設けることです。これはコードの重複なしに行う必要があります。

これを達成する1つの方法は、それに応じてアプリケーションの設計を変更することです。私が見つけた最も効果的なデザインはthis oneで、すべてのユースケースがシステム内で独自のメッセージを取得し、そのようなユースケースのビジネスロジックを汎用インターフェースを実装する単一クラスにカプセル化します。

このデザインでは、すべてのビジネス操作をラップすることができるデコレータを作成でき、操作が正常に終了したらUnitOfWork.Save()を呼び出すことができます。

また、答えはthis designです。

+0

答えは、UOWが単一のUOWを参照する複数のリポジトリではなく、関連するリポジトリへの参照を提供する必要があることを意味しますか?これは、ハンドラが代替手段を提供するUOW内のreposのインスタンスを作成するためのサービス・ロケータを意味すると仮定します。 [link](http://simpleinjector.readthedocs.io/en/latest/howto.html#resolve-instances-by-key)は同様の考え方ですか、それとも完全に逃していますか?あなたの 'MoveCustomerCommandHandler'がリポジトリをどのように参照しているのですか(最終的な一貫性を前提としていますか?) –

+1

@ Dr.Zim:これでどちらの方法も行くことができ、どちらも悪いことはありません。いずれにせよ、これはService Locator *を意味するものではありません。 UoWがレポストーリーの集合である場合、UoWの実装は[Composition Root](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)内にあります。これにより、実装は 'Container'に直接依存することができます。コンポジションルート内のコンテナの使用は、[サービスロケータのアンチパターンの実装ではありません](http://blog.ploeh.dk/2011/08/25/ServiceLocatorrolesvs.mechanics/)です。 – Steven

+0

'MoveCustomerCommandHandler'は、UoWまたは特定のリポジトリに依存します。最終的な整合性を使用するかどうかは、これとは無関係です。 – Steven

関連する問題