在我试图保持良好的存储库/ IoC设计时,我试图找出当前问题的最佳方法。
有两个对象Member
和Character
。
基本上,一个会员可以有很多角色。很简单。
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 编码。
答案 0 :(得分:4)
我认为你可能会接近存储库的方式与预期不同,这可能是造成某些困惑的原因。
存储库用于为一组数据提供集合语义。这意味着存储库获取,添加和删除内容。他们没有验证。他们不会改变有关个别物品的事情。它们不是数据访问对象(DAO),尽管似乎很多人最近将其命名为Repository,然后使其看起来像DAO。
您的会员包含一系列角色。大!想要为会员添加角色? 完全那个。 Member.AddCharacter(...)
或Member.Characters.Add(...)
。我通常使用前者,但后者也可以工作(但需要自定义集合实现)。
答案 1 :(得分:1)
我觉得IMemberRepository
负责填充Characters
的{{1}}。有几个原因:
Member
是IMemberRepository
类型的Member
,因此它知道Repository
的组成部分。这就是为什么它知道Member
类型。Character
的责任。 ICharacterRepository
类型可以在将来用于组合其他类型。每当您添加新类型时,这都会影响Character
的{{1}}。Character
将使用Repository
填充IMemberRepository
中的ICharacterRepository
个对象。答案 2 :(得分:0)
对我来说最自然的方法是将该逻辑放在Member类中,因为Member对象负责跟踪它自己的Character。
你怎么看?