ASP.net Web表单使用UnitOfWork模式处理实体上下文的位置

时间:2014-04-15 09:25:17

标签: c# asp.net entity-framework dispose unit-of-work

在我的网络应用程序中,我使用UnitOfWork类来处理与数据源的所有交互。下面是它继承的接口。

    public interface IUnitOfWork : IDisposable
{
    ActivityService ActivityService { get; }
    AmendmentService AmendmentService { get; }
    AspUserService AspUserService { get; }
    AttachmentService AttachmentService { get; }
    CampaignService CampaignService { get; }
    CommentService CommentService { get; }
    EventRegistrationService EventRegistrationService { get; }
    GroupService GroupService { get; }
    InstanceService InstanceService { get; }


    void Commit();
}

它继承了Idisposable,因此我在UnitOfWorks Dispose方法中处理实体上下文。但是,当我在我的网页中使用这个类时,我不知道是否应该创建一个UnitOfWork类作为页面的变量。

public partial class Members_Request : BasePage
{
 UnitOfWork uow = new UnitOfWork();

 protected void Page_Load(object sender, EventArgs e)
{
  Instance instance = uow.InstanceService.GetById(base.instanceId)
}


protected void Page_PreRender(object sender, EventArgs e)
{ 
//I don't think disposing here will work in all scenarios
uow.Dispose();
}

private void SomeOtherMethod(string name)
{ 
  Group newGroup = new Group{Name = name}

  uow.GroupService.Add(group))
  uow.Commit();
}

}

这样做我需要小心处理,例如,如果我需要Page_PreRender方法中的UnitOfWork,但它永远不会被调用,因为请求是一个回调,那么我的上下文永远不会被处理掉。我不确定我是否应该在我使用它的每个方法中处理它然后只需重新初始化它作为新的UnitOfWork,当我再次需要它以确保它始终处置。

确保它被处置的另一种方法是为我需要的每个方法创建一个新的UnitOfWork,这样上面的例子就会变成

  public partial class Members_Request : BasePage
{


 protected void Page_Load(object sender, EventArgs e)
{
  UnitOfWork uow = new UnitOfWork();

  Instance instance = uow.InstanceService.GetById(base.instanceId)

  uow.Dispose();
}

private void SomeOtherMethod(string name)
{ 
  UnitOfWork uow = new UnitOfWork();

  Group newGroup = new Group{Name = name}

  uow.GroupService.Add(group))
  uow.Commit();

  uow.Dispose();
}

}

所以我的问题是,当我每次请求共享同一个请求时,我如何确保我的UnitOfWork始终处理,或者我应该在需要时立即创建许多UnitOfWork对象并立即处理它们。我认为通过共享UnitOfWork的解决方案会更好,因为它可以减少代码膨胀。

编辑 - 我想这样做的另一种方法是在我的基页中包含此代码

protected UnitOfWork uow = new UnitOfWork();

    protected override void OnUnload(EventArgs e)
    {
        uow.Dispose();
        base.OnUnload(e);
    }

然后我想我可以在整个生命周期中使用相同的uow实例,并且知道它将永远被处理掉。

1 个答案:

答案 0 :(得分:2)

我使用它:在每个页面中覆盖dispose

public override void Dispose()
    {
        if(uow != null)
        {
            uow.Dispose();
        }
        base.Dispose();
    }

uow是我的UnitOfWork