控制器中的Dispose()
方法并不总是可靠的。同样,Session也可能不是一个好主意。 “最佳”可能是主观的,但通过使用依赖注入(Castle Windsor)和遵循工作单元库模式,我们取得了最好的成功。
安装工作的单位大致如下:
public class UnitOfWork : IUnitOfWork
{
public UnitOfWork()
{
this.Context = new MyEFEntities();
this.Context.ContextOptions.LazyLoadingEnabled = true;
}
public void Dispose()
{
this.Context.Dispose();
}
public ObjectContext Context { get; internal set; }
}
设置你的资料库:在Global.asax中与城堡
public class Repository<TEntity> : IRepository<TEntity>
where TEntity : class
{
public Repository(IUnitOfWork unitOfWork)
{
Context = unitOfWork.Context;
ObjectSet = Context.CreateObjectSet<TEntity>();
}
public ObjectContext Context { get; set; }
public IObjectSet<TEntity> ObjectSet { get; set; }
}
注册:
void Application_Start()
{
this.Container.Register(
Component.For<IUnitOfWork>()
.UsingFactoryMethod(() => new UnitOfWork())
.LifeStyle
.Is(LifestyleType.PerWebRequest)
);
ControllerBuilder.Current.SetControllerFactory(
new WindsorControllerFactory(this.Container));
}
和使用您的控制器(或您使用它的任何地方,只要它是可注射的):
public class SomeController
{
public SomeController(IRepository<MyEntity> repository)
{
this.Repository = repository;
}
public IRepository<MyEntity> Repository { get; set; }
public ActionResult MyAction()
{
ViewData.Model = this.Repository.ObjectSet.Single(x => x.Condition); //or something...
}
}
感谢您的回复lukiffer,但我的问题集中在更基础的东西不存储库,而不是DI的东西。我只是想知道什么方法在begin/endrequest事件或控制器类中最好,而不使用存储库和DI容器。 – Ray 2012-03-19 05:40:07
通过附加到开始/结束请求事件,您可以在请求的整个生命周期中访问相同的datacontext实例,而不仅仅是在控制器中(例如过滤器等),但最终它们是相同的。我提出长篇解释的唯一原因是因为我在网上农场/网络花园的请求上下文中遇到了问题,最终这是唯一有效的工作。 – lukiffer 2012-03-19 05:46:07
你的意思是这两种方式都可以支持延迟加载,对吧? – Ray 2012-03-19 15:13:01