在ASP.NET核心现有的存储库模式工作单位的正确实施

问题描述 投票:0回答:3

美好的一天,

我使用存储库模式。但有人建议我使用包括工作单位。我读了很多文章,老实说,我发现一个文档是过于复杂,理解。

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

// 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();
    }
}

我的问题是,我该如何使用工作单位吗?能否请您在下面给我一个代码。这将是这么多有用的,我听不懂。

c# asp.net interface repository-pattern unit-of-work
3个回答
2
投票

在您的IProductRepository添加保存方法

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

然后,在混凝土ProductRepository,你做两件事情:

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

不要对的DbContext的所有操作,并在最后调用保存()。

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

这是工作单位的要点。


0
投票

为什么你需要工作单位在项目的主要原因是,你需要确保所有的仓库都相同的情况下。像在实体框架的DbContext和DbSet之间的关系,工作单位和仓库之间的关系。

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


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;");
    }
}

他们有一个博客类,并在这个例子时得到迁移和更新的数据库(https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/)上运行创建成桌的Post类。现在你有博客和帖子中定义的BloggingContext里面,你可以创建一个实例(好,如果你喜欢https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext在这里使用依赖注入,你可以阅读更多有关)的BloggingContext和使用LINQ到你的心内容,无需自定义库或工作单位。 EF确实,一旦你已经确定你在什么情况下要什么类的工作。随着中说,我们确实使用工作的资源库和单位,我的工作,如果有一个理由使用极大的模式,但过去那种或学习为自己,EF确实非常好。

© www.soinside.com 2019 - 2024. All rights reserved.