实现存储库模式的正确方法是什么?以及如何使用?

时间:2018-09-30 03:29:38

标签: c# design-patterns repository-pattern mvp

我有一个名为Product的对象,我想从所有产品(存储在SQL Server中)的列表中检索特定产品的“物料清单”。我应该首先创建Product对象,然后通过一种方法从存储库中获取数据,例如:

var productId = "1";
Product product = new Product(productId);
DataTable billOfMaterial = product.GetBillOfMaterial();

或从静态存储库检索数据海峡,如下所示:

var productId = "1";
DataTable billOfMaterial = product.GetBillOfMaterial(productId);

或者也许是这样吗?

var productId = "1";
DataTable BillOfMaterial = ProductRepository.GetBillOfMaterial(productId);

或者也许当我创建产品时,我会自动在产品的构造函数中获得帐单:

var productId = "1";
Product product = new Product(productId);
DataGrid.DataSource = product.BillOfMaterial;

我正在使用MVP模式,并且不知道填充对象只是获取DataTable的最佳实践,还是我可以快速使用静态存储库。正确的方法是什么?

2 个答案:

答案 0 :(得分:7)

在实施存储库设计模式之前,您首先应该知道为什么要实施它。问题的答案是:

  • 最小化重复的查询逻辑。
  • 将您的应用程序与持久性框架(即Entity Framework ..)分离,以便您可以切换到新的持久性框架,而不会对主应用程序产生任何影响,因为所有更改都将保留在数据访问层上。
  • 提高可测性(模拟数据将变得更加简单)。

所以,现在让我们讨论一下实现: 实现存储库模式的正确方法是实现接口IProductRepository,该接口包含将在ProductRepository中实现的方法的签名。同样,这是您需要将其直接注入到IoC容器的接口。 因此,您的IProductRepository应该如下所示:

public interface IProductRepository
{
    IEnumerable<Product> GetBillOfMaterialById(string productId);
}

和您的ProductRepository应该如下所示:

public class DeviceHistoryRepository : IDeviceHistoryRepository
{

    public DeviceHistoryRepository(DbContext context)
    {
         Context = context;
    }
    public IEnumerable<Course> GetBillOfMaterialById(string productId)
    {
        return dbContext.Products.FirstOrDefault(p => p.ProductId == ProductId);
    }
}

然后从Presenter中,通过其构造函数注入存储库:

public class ProductPresenter: Presenter
{
    #region Declaration
    private readonly IProductRepository _productRepository;
    #endregion
    public ProductPresenter(IProductRepository productRepository)
    {
        #region Initialization
        _productRepository = productRepository;
        #endregion
    }
}

然后您可以从演示者的操作/方法中访问它,

Product product = _productRepository.GetBillOfMaterialById(productId);

答案 1 :(得分:-1)

标准方法是直接从该方法检索数据。这样,只有在您确实需要时才可以检索数据。

var productRepository = new ProductRepository();
DataTable billOfMaterial = productRepository.GetBillOfMaterial(productId);

由于可能存在并发问题,因此不使用静态存储库会更安全。 如果您使用的是.NET Core,则还可以使用具有依赖项注入功能的ASP.NET Core(https://docs.microsoft.com/en-us/aspnet/core/fundamentals/repository-pattern?view=aspnetcore-2.1)来实现存储库模式。