带有模式存储库的 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();
}

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

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

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

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