【问题标题】:How to use Unity and recreate ObjectContext every request如何使用 Unity 并在每个请求中重新创建 ObjectContext
【发布时间】:2012-09-11 04:24:09
【问题描述】:

我对 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);
    }

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,并在每次请求后重新创建上下文。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我认为从技术上讲,您需要一个每个请求的生命周期管理器,而不是瞬态的。每当您有依赖项时,Transient 都会为您提供一个新实例,而只要您在同一个 HTTP 请求中,每个请求都会为您提供相同的实例。后者通常是你想要的。 PerRequest 不提供包装,但有很多实现。
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2011-08-12
    • 2012-05-14
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多