IoC - Unity に問題があります。
簡単なウェブアプリを作りました。これは、PostId、title、Text の 3 つのフィールドを持つ 1 つのテーブル「Post」で構成されます。私は汎用リポジトリを使用します:
public abstract class BaseRepository<T> : IBaseRepository<T> where T : class
{
protected ObjectContext db = new BlogDbEntities();
/* CRUD */
}
public class PostRepository : BaseRepository<Post>, IPostRepository
{
public void Search(Expression<Func<Post, object>> predicate)
{
/* some search specific entity logic */
}
}
public interface IPostRepository : IBaseRepository<Post>
{
void Search(Expression<Func<Post, object>> predicate);
}
ご覧のとおり、そのリポジトリを int して、新しい BlogDbEntities - ObjectContext を作成します。コントローラーでは IPostRepository を使用します。コントローラーは非常にシンプルです。
public class PostController : Controller
{
IPostRepository postRepository;
public PostController(IPostRepository postRepository)
{
this.postRepository = postRepository;
}
public ActionResult Index()
{
postRepository.All.ToList();
return View();
}
protected override void Dispose(bool disposing)
{
postRepository.Dispose();
base.Dispose(disposing);
}
}
そして Global.asax では、Unity との依存関係を解決します。
var container = new UnityContainer();
var controllerFactory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
container.RegisterType<IPostRepository, PostRepository>(new ContainerControlledLifetimeManager());
たとえば /Post/ などのリクエストを行うときにアプリケーションを起動した後、最初のリクエストは正常に実行されました。しかし、リクエストを再度実行しようとすると、「ObjectContext インスタンスが破棄されたため、接続が必要な操作には使用できなくなりました」という例外が発生します。
Unity IoC フレームワークなしでリクエストを実行しようとすると、例外が表示されず、ObjectContext が正常に動作します。
その動作の原因は Unity だと思います。Unity Container に格納されたコンテキストだと思います。各リクエストの後にコンテキストを再作成して Unity を適切に構成する方法を教えてください。