Должен ли я объединить две сущности на уровне службы, уровне хранилища или создать хранилище для объединения этих двух? - PullRequest
2 голосов
/ 06 августа 2011

Я занимаюсь разработкой веб-приложения для некоммерческих организаций. (Приложение регистрирует рабочих за день, отслеживает их личную информацию, принимает рабочие задания и предоставляет интерфейс для назначения зарегистрированных рабочих на рабочее задание) У меня около 8 таблиц в SQL Server. Я начал с книги Сандерсона о MVC и попытался реализовать шаблоны, которые он рекомендует: IoC, разделение интересов, DI ...

Вот мои определения контекста:

    public DbSet<Person> Persons { get; set; }
    public DbSet<Worker> Workers { get; set; } //All workers are persons, but not all persons are workers.       
    public DbSet<WorkerSignin> WorkerSignins { get; set; } //1 entry per worker, per day (barcode scanner)
    public DbSet<Image> Images { get; set; }
    public DbSet<Employer> Employers { get; set; }  //1 employer has many work orders
    public DbSet<WorkOrder> WorkOrders { get; set; }  //1 work order has many work assignments
    public DbSet<WorkAssignment> WorkAssignments { get; set; } //1 assignment -> space for worker
    public DbSet<WorkerRequest> WorkerRequests { get; set; }
    public DbSet<Lookup> Lookups { get; set; }    //configuration, dropdowns, other stuff

Приложение находилось в производстве уже несколько месяцев - у некоммерческих организаций есть временные параметры ввода прошлых заказов и данных для целей отчетности, поэтому объем записей быстро растет. Они сталкиваются с некоторыми узкими местами в производительности, и когда я их исправлю, я бы хотел исправить их на нужном слое.

В нескольких случаях мне нужно отображать информацию из нескольких таблиц. Примеры:

  1. Отображение работника извлекает имя и фамилию из Персоны (с использованием коллекций EF)
  2. Дисплей WorkerSignin извлекает из Worker and Person
  3. Отображение получения WorkAssignment из WorkOrder

Итак, в случае № 1, лучше ли, чтобы моя служба «Работник» работала в службе «Персона», или хранилище «Работник» должно работать в хранилище «Персона»? Или я должен создать новый репозиторий, такой как CompleteWorker, который объединяет информацию из таблицы Person и Worker?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

В ваших репозиториях не должно быть сведений о каком-либо объекте, кроме объекта, с которым они работают.Лично я обнаружил, что лучший способ справиться с подобным сценарием состоит в том, чтобы мой репозиторий предоставил метод или свойство, которое возвращает IQueryable, чтобы я мог выполнять объединения на своем уровне обслуживания.

Итак, чтобы ответить на вашвопрос, ваша служба Worker будет зависеть как от хранилища Worker, так и от хранилища Person.

Или ваша база данных и модель настроены так, что вы можете просто использовать проекцию или метод Include для получения конкретных данных, которые вы ищете?

0 голосов
/ 06 августа 2011

На стороне вашего сервисного уровня используют многие хранилища для построения логики с сервисным уровнем.Держите ваш репозиторий Layer в чистоте.т. е. служба A может иметь репозиторий A, репозиторий B, репозиторий C. Используйте внедрение зависимостей для внедрения репозиториев в вашу службу.

public class ServiceA
{

 public PersonWorkerDTO GetPersonWorker()
 {
      RepositoryA.GetSomething();
      RepositoryB.GetSomething();
      RepositoryC.GetSomething();
 }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...