如何改进此存储库设计

本文关键字:存储 何改进 | 更新日期: 2023-09-27 18:29:44

在我目前的设计中,我创建了一个由字典组成的存储库,在那里你可以将几个名为Foo的对象设置为一个级别(Easy、Medium和Hard)。即

  • 简单级别: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对象的名称一样。例如,如果我想从一个级别获得一个特定的对象,我需要设置名称来获得它

现在对象是这样的:

  • 简易级别:[名称:foo1,foo1对象],[名称:foo2,foo2对象],【名称:foo3,foo3对象】
  • 中级:[名称:foo4,foo4对象]
  • 级别硬:[名称:foo5,foo5对象],[名称:foo7,Foo6对象]

我的意思是,每个名字都有一个唯一的名字,我想这个名字最好不要在另一个名字中重复。

这是我开始怀疑我的第一个设计的时候。我的第一个想法是IDictionary>,或者也许我应该将这个id包含在Foo属性中,但我想这不是最好的解决方案。

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

如何改进此存储库设计

嵌套词典怎么样?字典(级别,字典(字符串,Foo))

如果不了解更多关于如何使用存储库的信息,很难说是肯定的,但嵌套字典似乎正是您想要的。例如,在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 );
}