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