我对 IoC - Unity 有一些问题。
我做了一个简单的网络应用程序。它由一个表“Post”组成,该表具有三个字段:PostId、title、Text。我使用通用存储库:
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);
}
如您所见,在该存储库中创建新的 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,并在每次请求后重新创建上下文。