带有模式存储库的 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
构造函数中设置所有特定选项一次。
在我维护的项目中,我使用旧 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
构造函数中设置所有特定选项一次。