gpt4 book ai didi

c# - 存储库模式 C#

转载 作者:太空狗 更新时间:2023-10-29 21:32:25 26 4
gpt4 key购买 nike

我仍在学习编程,目前正在尝试使用 ASP.NET MVC5 为 friend 构建一个小的 CRUD 应用程序。因为我这样做主要是为了学习目的,所以我试图理解存储库模式。目前,我有一个用于使用 EF 检索数据的 DBContext 类和一个为我的所有表实现接口(interface)的 Repository 类。我的主要问题是我是否应该为不同的表使用不同的 Repository 类,因为如果我向它添加更多方法来操作 DB 数据,我的存储库类似乎会变得非常大,而如果我只使用接口(interface),那么 atm 似乎毫无意义1 个存储库类。如果我有多个存储库类,我应该使用依赖注入(inject)将所需的表注入(inject)到需要它的 Controller 中吗?如果我这样做,那么删除操作如何 - 如果我想删除具有奖金列表的 worker 并且我的 Controller 使用“ worker 存储库”我将如何删除与我的 worker 相关的奖金?我还在学习,我正在努力“正确学习”,这样我以后就不必重新学习了。所以任何帮助将不胜感激。

public class BonusSystemDbContext : DbContext
{
public DbSet<Admin> Admins { get; set; }
public DbSet<Worker> Workers { get; set; }
public DbSet<Position> Positions { get; set; }
public DbSet<Bonus> Bonuses { get; set; }
}

public class BonusSystemRepository : IBonusSystemRepository
{
private BonusSystemDbContext context = new BonusSystemDbContext();

public IEnumerable<Admin> Admins => context.Admins;

public IEnumerable<Bonus> Bonuses => context.Bonuses;

public IEnumerable<Position> Positions => context.Positions;

public IEnumerable<Worker> Workers => context.Workers;

public void SaveBonus(Bonus bonus)
{
if (bonus.ID == 0)
{
context.Bonuses.Add(bonus);
} else
{
Bonus dbEntry = context.Bonuses.Find(bonus.ID);
if (dbEntry != null)
{
dbEntry.WorkerID = bonus.WorkerID;
dbEntry.Date = bonus.Date;
dbEntry.Amount = bonus.Amount;
}
}
context.SaveChanges();
}

public void SavePosition(Position position)
{
if (position.ID == 0)
{
context.Positions.Add(position);
} else
{
Position dbEntry = context.Positions.Find(position.ID);
if (dbEntry != null)
{
dbEntry.Workers = position.Workers;
dbEntry.Name = position.Name;
dbEntry.BeginBonusKg = position.BeginBonusKg;
dbEntry.CentsPerKg = position.CentsPerKg;
}
}
context.SaveChanges();
}

public void SaveWorker(Worker worker)
{
if (worker.ID == 0)
{
context.Workers.Add(worker);
} else
{
Worker dbEntry = context.Workers.Find(worker.ID);
if (dbEntry != null)
{
dbEntry.FirstName = worker.FirstName;
dbEntry.LastName = worker.LastName;
dbEntry.Position = worker.Position;
dbEntry.PositionID = worker.PositionID;
dbEntry.Bonuses = worker.Bonuses;
dbEntry.HealthCertificate = worker.HealthCertificate;
dbEntry.WorkHealthCare = worker.WorkHealthCare;
}
}
context.SaveChanges();
}
}

public interface IBonusSystemRepository
{
IEnumerable<Admin> Admins { get; }
IEnumerable<Bonus> Bonuses { get; }
IEnumerable<Position> Positions { get; }
IEnumerable<Worker> Workers { get; }

void SaveBonus(Bonus bonus);
void SavePosition(Position position);
void SaveWorker(Worker worker);
}

还有我的数据库样本表对象:

public class Worker
{
[Key]
public int ID { get; set; }

[ForeignKey("Position")]
public int PositionID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? WorkHealthCare { get; set; }
public DateTime? HealthCertificate { get; set; }

public virtual Position Position { get; set; }
public virtual ICollection<Bonus> Bonuses { get; set; }
}

public class Bonus
{
[Key]
public int ID { get; set; }

[ForeignKey("Worker")]
public int WorkerID { get; set; }

public DateTime? Date { get; set; }

public decimal Amount { get; set; }

public virtual Worker Worker { get; set; }
}

最佳答案

很高兴你提出这个问题。简单的答案是不要使用存储库模式。存储库模式的目的是将 SQL 和其他低级数据访问逻辑抽象出来,因此,该模式对于像 Entity Framework 这样的 ORM 来说是多余的。事实上, Entity Framework 已经实现了工作单元和存储库模式:DbContext 是 UoW,每个 DbSet 都是一个存储库。

这并不意味着在数据层上创建抽象仍然不是一个好主意,只是该抽象不应该是存储库。您可以使用 Service Layer pattern或类似 Command Query Responsibility Segregation (CQRS) pattern 的东西.

注意:服务层模式与 Microsoft 的“服务模式”有很大不同,后者直接与使用(通常是基于 SOAP 的)网络服务相关。

关于c# - 存储库模式 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43724456/

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