一页请求中的最大“工作单位”?

时间:2009-05-15 03:01:09

标签: linq-to-sql domain-driven-design datacontext

它不是一个吗?我有一个从不同的存储库获取五个列表的方法。每次调用都会打开和关闭一个新的Datacontext。这样做是可以的,还是应该将所有内容都包装在一个datacontext中。在这种情况下,使用相同的datacontext并不是直截了当的,但我担心在一个页面请求中打开和关闭大量的datacontext并不好。

2 个答案:

答案 0 :(得分:2)

以下是关于该主题的文章......

Linq to SQL DataContext Lifetime Management

他建议每个请求一个,我已经在一些应用程序中实现了这个模式,它对我来说效果很好。

他在文章中谈了一点...他的快速和脏版本引用了System.Web并做了类似的事情:

    private TDataContext _DataContext;

    public TDataContext DataContext
    {
        get
        {
            if (_DataContext == null)
            {

                if (HttpContext.Current != null)
                {
                    if (HttpContext.Current.Items[DataContextKey] == null)
                    {
                        HttpContext.Current.Items[DataContextKey] = new TDataContext();
                    }

                    _DataContext = (TDataContext)HttpContext.Current.Items[DataContextKey];
                }
                else
                {
                    _DataContext = new TDataContext();
                }
            }

            return _DataContext;
        }
    }

但是他建议你采取下一步并删除对System.Web的引用并使用依赖注入并创建自己的IContainer,它可以根据你是否在单元测试中运行来确定datacontext的生命周期申请等。

示例:

public class YourRepository
{

    public YourRepository(IContainer<DataContext> container)
    {

    }

}

然后将HttpContext.Current.Items[DataContextKey]替换为_Container[DataContextKey]

希望这会有所帮助...

答案 1 :(得分:0)

我在每个请求的工作单元上使用并构建了一个IHttpModule来管理工作单元生命周期,根据请求创建它并随后将其放置。当前的工作单元存储在HttpContext.Current.Items中(隐藏在Local.Data中)。