MVC 3 Как мне создать свой репозиторий / DAL? - PullRequest
1 голос
/ 10 января 2012

со следующей моделью домена: Мир -> Франшиза -> Офис -> Агент

Я понимаю, что репозитории должны возвращать агрегированные корни. Какая из этих сущностей домена является корнем агрегирования? или все (мне нужен репозиторий для каждого)?

Я хочу иметь возможность получать сущности через их идентификатор, передаваемый по URL. Где я могу разместить эти методы GetById?

Если я хочу получить список всех агентов в рамках франшизы с частичным именем «Джо», как мне встроить это в систему? Нужно ли мне: Есть ли в сущности Franchise метод, который в основном является оператором .SelectMany linq? или есть репозиторий для агента, который имеет метод GetByPartialFirstName ()?

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Зависит от логики домена: если объект должен использоваться самостоятельно, то он является агрегатным корнем, если вы хотите получить экземпляр «агента» и вызывать методы непосредственно из кода своего потребителя, тогда он должен иметь егособственный репозиторий, в противном случае, если он будет использоваться как часть «Office» и его методы вызываются из его корневого «Office», он не является совокупным корнем, и вам не нужно извлекать его независимо от репозитория.

Примените это правило ко всем сущностям, чтобы решить, для чего создать хранилище.

0 голосов
/ 10 января 2012

У меня нет опыта работы с репозиториями, но я бы предположил, что если вы планируете использовать несколько способов поиска ваших агентов, я бы порекомендовал создать интерфейс / класс критериев. Это позволит вам выполнять несколько типов комбинированного поиска с помощью одного вызова метода (имя / фамилия, имя / город и т. Д.).

(мне нравится использовать интерфейсы, чтобы отделить свое приложение и источник данных)

public IEnumerable/IQueryable<IAgent> Get(IAgentCriteria Criteria)
{
  if (Critiria == null) throw new ArgumentNullException();

  var result = entities.Agents;

  if (!string.IsNullEmptyOrWhiteSpace(Criteria.FirstNameStartsWith))
  {
    result = result.Where(x => x.FistName.StartsWith(Criteria.FirstNameStartsWith));
  }

  // etc etc
}
...