以下の簡略化された例では、かなり合理的な方法で定義されていると思うDataContextとリポジトリがあります。
public interface IUnitOfWork
{
int SaveChanges();
}
public class DataContext : DbContext, IUnitOfWork
{
public DbSet<Car> Cars { get ; set; }
}
public interface ICarsRepository
{
Car Find(int id);
void Add(Car car);
}
public class SqlCarsRepository : ICarsRepository
{
private DataContext _context;
public SqlCarsRepository(DataContext context)
{
_context = context;
}
public Car Find(int id)
{
return _context.Cars.Find(id);
}
//etc
}
DIと抽象的なファクトリパターンを使用して、自分が望むものを実現する方法を見つけるのに苦労しています。MVCアプリケーションでは、これは簡単にセットアップできます。コントローラーは、コンストラクターにIUnitOfWorkとICarsRepositoryの実装のインスタンスを必要とします。別のコントローラーファクトリを使用して、Httpリクエストごとに同じDataContextインスタンスを提供するようにコンテナーを構成できます。どういうわけか、ここでは使い捨ての依存関係が正しく処理されているようです。
ただし、Windowsサービス内で同じリポジトリを使用したいと思います。これはマルチスレッドであり、開始時に各スレッドは独自のリポジトリにアクセスする必要があり、各スレッドは独自のDataContext/UnitOfWorkを持つ必要があります。しかし、私はこれを行う方法がわかりません:
- アプリケーションの複合ルートはサービスの開始時であるため、スレッドごとに依存関係を解決することはできません(スレッドはオンデマンドで開始されます)。
- 抽象ファクトリパターンをどのように使用できるかわかりません。スレッドにはIUnitOfWorkとICarsRepositoryのインスタンスが必要ですが、同じDataContextを共有しています。抽象ファクトリを作成して、これらの両方を1回の呼び出しで作成し、それをスレッドに渡すことはできますが、DataContextを破棄する方法がわかりません。ICarsRepositoryの実装への依存関係が使い捨てであることをスレッドが気にする必要はありません。ICarsRepositoryがDataContextに依存していることをスレッドに知られたくないのは、インターフェイスが無意味に見えるためです。スレッドはSqlCarsRespositoryに依存している可能性があります。
- DataContextを使用している他の人がいる可能性があり、そもそもそれを作成しなかったため、SqlCarsRepositoryを使い捨てにしてDataContextを破棄させたくありません。
- IUnitOfWorkとICarsRepositoryを非表示にするCarsServiceを作成できると思いました(そして抽象ファクトリを使用してそのインスタンスを取得します)が、それでもDataContext依存関係を破棄する方法がわかりません
私が試みていることを行うための最良の方法は何ですか?