繁体   English   中英

C# LinqToSql LoadOption 与模式存储库

[英]C# LinqToSql LoadOption with pattern repository

在我维护的项目中,我使用存储库模式重构了一些逻辑,而不是旧的 ORM (LinqToSql)。

我现在的问题是有时我必须跨存储库共享 DataContext (这是一个理想的功能),但这些存储库试图“窃取”彼此的加载选项。

这是我的存储库构造函数的示例,它接收 DataContext 并构建正确的加载选项。

    public ArticleRepository(DataContext datacontext) : base(datacontext)
    {
        this.Name = "ArticleRepository";

        lock ( _sync )
        {
            this.Datacontext = datacontext; // --> this is done in base class, assing the shared object to the current repository.
            this.Datacontext.DeferredLoadingEnabled = false;

            DataLoadOptions options = new DataLoadOptions();
            options.LoadWith<tbl_ana_Article>(article => article.UoM);
            options.LoadWith<tbl_ana_Article>(article => article.Brand);
            this.Datacontext.LoadOptions = options;
        }
    }

但我也有 OrderRepository 它自己的加载选项。

当我在同一个 DataContext 上使用此类存储库时会出现问题:

using ( var context = new MyDatacontex("...") )
{
    var articleRepo = new ArticleRepository(context);
    var orderRepo = new OrderRepository(context);// <-- here the loading option are overwritten

    articleRepo.DoStuff();
    orderRepo.DoOtherStuff();

    context.SubmitChanges();
}

现在在这种特定情况下,我可以重新排序操作并避免出现问题,但这是一个非常具体且脆弱的解决方案。

我不知道我是否必须在构造函数中指定加载选项,将其保存在 object 中,并在每次使用数据上下文之前覆盖共享数据上下文属性(读取)。 这是一个好的解决方案还是有更好的解决方案?

由于Context是同一个 object,所以使用前必须准备好。 这是一个复杂的场景,因此在使用之前必须警告您“上下文选项”的 state。 如果在特定用法之前更改它,则下一个用法必须清除最后一个选项或设置自己的选项。 最好的方法可能是您在使用前设置选项并在使用后将其返回到以前的 state 以便一切都清楚。 但在异步场景中,您可能会看到意想不到的行为。

另请注意,有些选项是共享的,而有些则不是。 例如DeferredLoadingEnabled是一个共享设置,而LoadWith是一个特定选项。 您可以决定在Context构造函数中固定共享设置并设置所有特定选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM