2012-04-01 27 views
0

在我当前的设计中,我创建了一个存储库,它由一个字典组成,您可以在其中将几个名为Foo的对象设置为一个级别(简单,中等和难度)。 I.E.如何改进此存储库设计?

  • 级别EASY: Foo1对象和Foo2对象,Foo3对象
  • 水平中等: Foo4对象
  • 级硬盘: Foo5对象,Foo6对象

这是我的信息库:

public interface IFoosRepository 
{ 
    void AddFooLevel(Levels level, Foo foo); 
    void RemoveFooLevel(Levels level); 
    Foo GetProblemFoo(Levels level); 
    IEnumerable<Levels> GetFooLevels(); 
    IEnumerable<Foo> GetFoos(); 
} 

public class FoosRepository : IFoosRepository 
{ 
    private IFoosService service; 
    private Dictionary<Levels, Foo> _fooLevels = new Dictionary<Levels, Foo>(); 

    public FoosRepository() 
     : this(new FoosService()) 
    { 
    } 

    public FoosRepository(IFoosService service) 
    { 
     this.service = service; 

     // Loads data into the _fooLevels 
     // ... 
    } 

    public void AddFooLevel(Levels level, Foo foo) 
    { 
     _FooLevels.Add(level, foo); 
    } 

    public void RemoveFooLevel(Levels level) 
    { 
     _FooLevels.Remove(level); 
    } 

    public Foo GetProblemFoo(Levels level) 
    { 
     return _FooLevels[level]; 
    } 

    public IEnumerable<Levels> GetFooLevels() 
    { 
     return _FooLevels.Keys; 
    } 

    public IEnumerable<Foo> GetFoos() 
    { 
     return _FooLevels.Values; 
    } 
} 

然后,我意识到另一件事,我需要一个uniqueId像foos对象的名称。 I.E.如果我想从一个关卡中获取特定的对象,我需要设置名称来获取它。

现在的对象会是这样:

  • 级别EASY: [名称:foo1,Foo1对象],[名字:foo2的和Foo2对象],[名字:foo3,Foo3对象]
  • 等级介质: [名:foo4,Foo4对象]
  • 等级硬: [名:foo5,Foo5对象],[名称:foo7,Foo6对象]

我的意思是,每个名字都伴随着一个独特的名字,我想这将是最好的,这个名字不会在另一个更多的重复。

这是当我开始怀疑我的第一个设计。我的第一个虽然是IDictionary>,或者我应该不得不包括这个ID到Foo属性,但我想这不是最好的解决方案。

我应该修改什么来实现这个新功能?

回答

0

嵌套字典怎么样?字典(级别,字典(的字符串,美孚))

0

很难肯定地说,不知道更多关于你的存储库将如何使用,但嵌套字典似乎是你想要的。例如,在你的FoosRepository类:

private IDictionary<Levels,IDictionary<string,Foo> _foos = new Dictionary<Levels,IDictionary<string,Foo>>; 

然后,例如,您AddFooLevel将成为:

public AddFooLevel(Levels level, string name, Foo foo) { 
    IDictionary<string,Foo> level = null; 
    if(_foos.ContainsKey(level)) { 
    level = _foos[level]; 
    } else { 
    level = new Dictionary<string,Foo>(); 
    _foos.Add(level); 
    } 
    level.Add(name, foo); 
}