ASP.NET核心中现有存储库模式的工作单元的正确实现

时间:2018-03-13 05:22:05

标签: c# asp.net interface repository-pattern unit-of-work

美好的一天,

我使用的是存储库模式。但有人建议我使用包含工作单位。我读了很多文章,老实说,我找到了一个太难理解的文档。

假设我有一个非通用的存储库。

// My Interface 
public interface IProductRepository{
    IQueryable Products();
    IQueryable ProductById(int id);
    void InsertProduct(Product product);
    void UpdateProduct(Product product);
    void DeleteProductById(int id);
}

// Abstract Implementation

public class ProductRepository : IProductRepository{
    private readonly MyDbContext context;

    public ProductRepository(MyDbContext context){
        this.context= context;
    }

    public IQueryable Products(){  
        context.Product(); 
    }
    public IQueryable ProductById(int id){ 
        context.Product().Where(prod=>prod.Id == id);    
    }
    public void InsertProduct(Product product){
        context.Product.Add(product);
        context.SaveChanges();
    }
    public void UpdateProduct(Product product){
        context.Product.Update(product);
        context.SaveChanges();
    }
    public void DeleteProductById(int id){
        var product = ProductById(id);
        context.Product.Remove(product);
        context.SaveChanges();
    }
}

我的问题是,我如何在这里使用工作单元?你能告诉我下面的代码吗?这对我来说非常有帮助。

3 个答案:

答案 0 :(得分:2)

在您的IProductRepository中添加保存方法

// My Interface 
public interface IProductRepository{
    // ...
    void Save();
}

然后在具体的ProductRepository中,您要做两件事:

  1. 删除所有对context.SaveChanges();
  2. 的调用
  3. 在IProductRepository.Save实现中,调用context.SaveChanges()

对dbcontext执行所有操作,最后调用Save()。

static void main() {
    // ...
    this.productRepository.InsertProduct(product1);
    this.productRepository.InsertProduct(product2);
    this.productRepository.InsertProduct(product3);
    this.productRepository.Save();
}

这是工作单元的要旨。

答案 1 :(得分:0)

您需要在项目中使用工作单元的主要原因是您需要确保所有存储库具有相同的上下文。工作单元和存储库之间的关系,如实体框架中DbContext和DbSet之间的关系。

如果您想实施UnitOfWork,可以参考以下链接:https://codereview.stackexchange.com/questions/47879/unit-of-work-and-repository-with-entity-framework-6

答案 2 :(得分:0)

这实际上是对有关EF开展工作的评论中的问题的答案
如果您查看EFCore的工作方式,则实际上定义了一个上下文,并定义了在该上下文中需要哪些类。他们从https://docs.microsoft.com/en-us/ef/core/定义了从DbContext继承的BloggingContext。下面的示例来自Microsoft:

    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");
    }
}

在此示例中,它们具有Blog类和Post类,当在数据库上运行迁移和更新(https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/)时,它们会创建到表中。现在,您已经在BloggingContext中定义了Blog和Post,您可以创建BloggingContext的实例(很好地使用依赖项注入,如果您喜欢https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext,可以在此处阅读有关此内容的更多信息),并使用linq满足您的需求,需要自定义存储库或工作单元。一旦定义了在什么上下文中想要的类,EF就会开始工作。 话虽如此,如果确实有理由使用很棒的模式,那么我们确实会在我工作的地方使用存储库和工作单元,但是除此之外,还是自己学习,EF确实做得很好。