正确的存储库设计,将一个对象附加到另一个对象

时间:2010-12-16 17:06:00

标签: c# asp.net-mvc repository-pattern separation-of-concerns

在我试图保持良好的存储库/ IoC设计时,我试图找出当前问题的最佳方法。

有两个对象MemberCharacter

基本上,一个会员可以有很多角色。很简单。

Member
{
 IList<Character> Characters { get; set; }
}

IMemberRepository ...

interface IMemberRepository
{
 MemberCreateStatus CreateMember(string email, string password);
 bool ValidateMember(string email, string password);
 bool ChangePassword(string email, string password, string newPassword);
 void RecoverPassword(string email);
}

还有ICharacterRepository

interface ICharacterRepository
{
 Character CreateCharacter(string name);
}

那么,我的问题很简单。我想在哪里添加逻辑以将Character添加到Member?我是否在IMemberRepository中执行此操作?这对我来说似乎很麻烦。它似乎超出了IMemberRepository任务的范围。我是否将其添加到ICharacterRepository?这对我来说似乎有点奇怪,因为提供会员资格的知识似乎违反了让他们分开。在这里,最好的方法是什么?

如果只是这一种方法,那就不会太大了 - 但是在这两种类之间必然会发生很多其他事情。什么是“标准”方法来处理这两种物体相互关联的情况?我在 ASP.NET MVC 编码。

3 个答案:

答案 0 :(得分:4)

我认为你可能会接近存储库的方式与预期不同,这可能是造成某些困惑的原因。

存储库用于为一组数据提供集合语义。这意味着存储库获取,添加和删除内容。他们没有验证。他们不会改变有关个别物品的事情。它们不是数据访问对象(DAO),尽管似乎很多人最近将其命名为Repository,然后使其看起来像DAO。

您的会员包含一系列角色。大!想要为会员添加角色? 完全那个。 Member.AddCharacter(...)Member.Characters.Add(...)。我通常使用前者,但后者也可以工作(但需要自定义集合实现)。

答案 1 :(得分:1)

我觉得IMemberRepository负责填充Characters的{​​{1}}。有几个原因:

  • 由于MemberIMemberRepository类型的Member,因此它知道Repository的组成部分。这就是为什么它知道Member类型。
  • 肯定不是Character的责任。 ICharacterRepository类型可以在将来用于组合其他类型。每当您添加新类型时,这都会影响Character的{​​{1}}。
  • Character将使用Repository填充IMemberRepository中的ICharacterRepository个对象。

答案 2 :(得分:0)

对我来说最自然的方法是将该逻辑放在Member类中,因为Member对象负责跟踪它自己的Character。

你怎么看?