如何使用Unity并在每个请求中重新创建ObjectContext

时间:2012-09-18 20:54:52

标签: c# asp.net-mvc entity-framework unity-container idisposable

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());

启动应用程序后,我请求示例/发布/第一次请求正常执行。但是当我再次尝试执行请求时,我得到Exception “ObjectContext实例已经被处理掉,不能再用于需要连接的操作。”

当我尝试在没有Unity时执行请求IoC框架异常未显示且ObjectContext正常工作。

我猜这种行为的原因是Unity,我认为存储在Unity Container中的上下文。谁可以帮助我如何正确配置Unity,并在每次请求后重新创建上下文。

1 个答案:

答案 0 :(得分:2)

  

谁可以帮助我在每次请求后如何正确配置Unity并重新创建上下文。

注册类型时,您可以指定要使用TransientLifetimeManager,这会导致每次调用都创建一个新实例。