我的对象模型中有一个多级依赖关系链:
组织具有以下子女关系:
Organization
.CompetitionGroups
.CompetitionGroups.Venues
.CompetitionGroups.Competitions
.Divisions.Games
.Divisions.Games.Participants
.Divisions.Games.Participants.GameSegments
.Divisions.SubDivisions...
.Divisions
.Teams
.Teams.Players
.Teams.Participants
.Teams.Participants.GameSegments
.VenueDates
这只是对象模型的一瞥,但它关注的是关系和列表的复杂性。
考虑到完成一个工作单元的要求,我无法真正得到的是考虑我的存储库接口的最佳方法。
例如,要创建游戏,您需要一个venposate和两个参与者。这是否意味着GamesController应该需要IGameRepository,IVenueDateRepository和IParticipant存储库?它们应该被归入一个存储库吗?
另外,在消费案例中呢?例如,要显示单元团队的日程安排,您需要该团队的所有参与者,该参与者的所有游戏以及参与者的所有游戏部分。如果将这些因素考虑在个别存储库中,我就无法看到如何进行有效的查询。
这是否意味着您有专门针对不同案例的存储库?例如:
public interface IScheduleRepository {
public ICollection<Game> GetScheduleForTeam(Team team);
// More consumption methods
}
public class ScheduleRepositry : IScheduleRepository {
public ScheduleRepository (ModelContext context) {
// Do stuff with context
}
public ICollection<Game> GetScheduleForTeam(Team team) {
return (
from p in context.Participants
where ((p.Game.VenueDate != null) &&
(p.TeamId == team.Id))
orderby p.Game.VenueDate.StartTime
select p.Game).ToList();
}
// more consumption methods
}
public interface IGameRepository {
public void AddGame(Game game);
// More crud methods
}
// Not showing games repository
public class GamesController : Controller {
public GamesController (IGameRepository gamesRepo,
IVenueDateRepository venueDateRepo,
IParticipantRepository participantRepo) {
// do stuff with repos here
}
[HttpPost]
public ActionResult AddGame(Game game) {
// Skipping validation logic
// this?
VenueDate = venueDateRepo.Add(game.VenueDate);
foreach (Participant p in Game.Participants)
{
participantRepo.Add(p);
}
Game = gamesRepo.AddGame(game);
// or this?
// how would the game repo know to persist
// the children elements? is that tight coupling?
Game = gamesRepo.AddGame(game);
}
// more consumption methods
}
我的问题是,我还不了解基于连接对象模型将您的存储库分解为什么程度。我想在这里得到一些建议。
答案 0 :(得分:0)
您需要定义aggregate roots和边界,然后围绕根设计存储库。
this book(注册后免费)
有一个很好的(简短的)章节至于做一个工作单元,我通常将它作为服务层的一个功能。因此,控制器具有对服务的引用,该服务处理存储库,实体,工作单元等之间的编排。