リポジトリを使用せずにビジネス/サービスレイヤーでEFを直接使用したいのですが、テストDBを使用してクラスをテスト可能にする場合、コンテキストを作成/破棄するのに最適な場所はどこか疑問に思いました。
サービスコンストラクターでDIを使用し、クラスをIDisposableとしてマークしてそこで削除するか、各呼び出しをusingブロックでラップする必要がありますか?
リポジトリを使用せずにビジネス/サービスレイヤーでEFを直接使用したいのですが、テストDBを使用してクラスをテスト可能にする場合、コンテキストを作成/破棄するのに最適な場所はどこか疑問に思いました。
サービスコンストラクターでDIを使用し、クラスをIDisposableとしてマークしてそこで削除するか、各呼び出しをusingブロックでラップする必要がありますか?
リポジトリクラスに抵抗があるかどうかはわかりませんが、ここで、サービスレイヤーのEFコンテキストを破棄するように作成しています。
そのため、MVC Webアプリの場合、autofacを使用してlifetimescopeでリポジトリを登録します
builder
.RegisterType<AccountRepository>()
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
私のアカウントサービスは、コンテナからリポジトリインスタンスへの参照を取得し、Webリクエストの存続期間を通じて単一のコンテキストにアクセスできます。リクエストが完了すると、Autofacはリポジトリでdisposeを呼び出し、コンテキストをクリーンアップします。
public sealed class AccountRepository : IAccountRepository, IDisposable
{
private AccountContext _context = new AccountContext();
public IList<AccountEntity> GetAccounts()
{
return _context.Accounts
.OrderBy(x => x.Name)
.ToList();
}
public void Dispose()
{
_context.Dispose();
_context = null;
}
}