gpt4 book ai didi

c# - 使用存储库模式,我们应该为 DAL 中的每个表还是业务层中的对象定义类?

转载 作者:行者123 更新时间:2023-11-30 20:52:29 24 4
gpt4 key购买 nike

当您拥有较大的数据库时,如何使用 Entity Framework 在 C# 中正确实现存储库模式?

我们应该为每个在 DAL(数据访问层)中实现 Repository 接口(interface)的表定义类,还是在我们的业务层中定义这样的对象?

Repository<RetailerMarketplace> retailerMarketplaceRepo = null;
Repository<Marketplace> marketplaceRepo = null;
Repository<Product> productRepo = null;
Repository<OP_FLAGS> opFlagsRepo = null;
Repository<RetailerMarketplaceAttributeMapping> retailerMPAttributesMappingRepo = null;
Repository<EbayVariation> ebayVariationRepo = null;
Repository<ProductIsListed> productIsListedRepo = null;
Repository<Skus_OpFlags> skusOpFlagsRepo = null;

目前我已经像上面那样定义了对象,但我对定义对象并在 DAL 或业务层中使用它们的正确方法感到困惑?

最佳答案

不要创建任何 Repository业务层中的对象。您应该将工作单元模式与您的存储库模式一起使用。您的 DAL 应该有一个工作类单元,仅将必要的存储库作为属性公开。该工作类单元充当您的业务层和数据访问层之间的唯一网关。

例如,假设我有两个实体 FooBar结构如下:

public class Foo
{
public int FooId { get; set; }
public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
public int BarId { get; set; }
public int FooId { get; set; }
public virtual Foo Foo { get; set; }
}

我的 UnitOfWork类可能如下所示:

public class UnitOfWork
{
private Repository<Foo> foos;

public Repository<Foo> Foos
{
get
{
if(foos == null)
foos = new Repository<Foo>();
return foos;
}
}

...
}

就为每个实体定义一个存储库而言,您需要决定您真正需要包含哪些实体。例如我的 UnitOfWork不包括 Repository<Bar> .也许我这样做是因为我可以访问所有 Bar通过其关联的链接属性 Foo在我的域中查找 Bar 没有意义在其自己的。底线:这完全取决于您公开的存储库的域。明智地选择。

This article由 ASP.NET/MVC 团队编写,但其中的存储库/工作单元原则是使用 Entity Framework 的任何事物的良好实践。无论您是否使用 MVC,这都是一本好书。

关于c# - 使用存储库模式,我们应该为 DAL 中的每个表还是业务层中的对象定义类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20853024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com