LUKIYA'S NEVERLAND

春去秋来,花谢花开。


最近学习Code First,把MVC的注入方式从Castle Windsor转到Unity,期间遇到的最大问题就是UnitOfWork里的多个Repositories共享同一个DbContext的问题。

现在有两种解决方法,分别对应Web开发和单例客户端开发。

首先说单例客户端开发,很简单的一条语句,困扰了我大半天。

      _container.RegisterInstance(new DbContextAdapter(_container.Resolve<DbContext>()), new ContainerControlledLifetimeManager());
      _container.RegisterType<IObjectSetFactory>(new InjectionFactory(con => con.Resolve<DbContextAdapter>()));
      _container.RegisterType<IObjectContext>(new InjectionFactory(con => con.Resolve<DbContextAdapter>()));

通过这样的方式,就可以让组件共享一个Context。ContainerControlledLifetimeManager表示Context的声明周期跟Container的相同。

 

同样的,再说Web开发,Web开发是多线程,每一次请求都会调用对应的UnitOfWork,所以我们可以将ContainerControlledLifetimeManager替换ContainerControlledLifetimeManager,这个Manager可以保证在MVC的Controller生命周期内都是单例模式,折腾了一晚上终于搞定,睡觉。