2012-04-01 2 views
0

В моем текущем проекте я создавал репозиторий, где он составлен из словаря, где вы можете установить несколько объектов, называемых Foo, на уровень (простой, средний и жесткий). И.Е.Как улучшить дизайн этого репозитория?

  • Уровень Easy: Foo1 объект, объект Foo2, foo3 объект
  • Level Medium: Foo4 объект
  • Level Hard: 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; 
    } 
} 

Затем я понял другое: мне нужно иметь уникальный идентификатор, как имя для объектов foos. И.Е. если я хочу иметь определенный объект с уровня, мне нужно установить его имя для его получения.

Теперь объекты будут выглядеть так:

  • Уровень Easy: [имя: foo1, Foo1 объект], [имя: foo2, Foo2 объект], [имя: foo3, foo3 объект]
  • Уровень Medium: [имя: foo4, Foo4 объект]
  • Level Hard: [имя: foo5, объект foo5], [имя: foo7, Foo6 объект]

Я имею в виду, что каждое имя сопровождается уникальным именем, и я думаю, это будет лучшее, что это имя не повторится в другом.

И вот когда я начинаю сомневаться в своем первом дизайне. Мой первый, хотя был IDictionary>, или, может быть, мне следовало бы включить этот id в атрибут Foo, но я думаю, это не лучшее решение.

Что следует изменить для реализации этой новой функции?

ответ

0

Как насчет вложенных словарей? Словарь (Уровни, Словарь (из String, Foo))

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); 
} 
Смежные вопросы