2013-11-29 4 views
2

У меня есть следующие интерфейсы службы WCF:Образцовый шаблон - это глобальный репозиторий - хорошая идея?

  • IProductRepository
  • IFieldRepository
  • IFieldValueRepository
  • ICategoryRepository

Я реализовать каждый из них в отдельный проект под названием DatabaseRepository, в то время как Product, Field, FieldValue и Category все находятся в общей библиотеке, совместно используемой службой и проектом репозитория.

Продукты содержат поля, которые, в свою очередь, содержат FieldValues. Мне не нравится идея моего конструктора служб, в который входят 4 репозитория, поэтому у меня также есть IGlobalRepository, который содержит свойство для каждого другого репозитория. Я создаю экземпляр службы, передав конкретную реализацию IGlobalRepository конструктору, используя привязку на основе Ninject, привязавшуюся ко мне, когда служба размещена в IIS.

Так что на моем веб-службы GetProductsByCategory выглядит примерно так:

private IGlobalRepository Repo { get; set; } 

public IEnumerable<Product> GetProductsByCategory(int CategoryID){ 
    return Repo.ProductRepository.GetByCategory(int CategoryID); 
} 

Это все хорошо, за исключением того, что продукты имеют поля и поля имеют значения. Означает ли это, что мне нужно передать конкретные реализации IFieldRepository и IFieldValueRepository в Repo.ProductRepository?

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

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

Так теперь мой актуальный вопрос:

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

+0

Вы пишете модульные тесты в этом проекте? – MattDavey

+0

Да, я. Это фактически существующий проект, который я рефакторинг для использования шаблона репозитория для этой цели. – Maloric

+1

Это 'IGlobalRepository' действительно пахнет единицей работы; ничего плохого в этом. – Steven

ответ

2

Я не думаю, что глобальный репозиторий - хорошая идея.

Вы должны создать определение репозитория в соответствии с использованием. Так что да, продукт repo должен вернуть все необходимые данные, и он не имеет ничего общего с FieldRepo или другим репо.

Приложение связано только с интерфейсом, и один репозиторий может реализовывать несколько интерфейсов. Кроме того, вы можете иметь разные конкретные репозитории, работающие с одним и тем же. Точка репо не должна иметь одного репо для каждого объекта, это обеспечить интерфейс для приложения, чтобы получить то, что ему нужно, от сохранения. Как вы структурируете вещи НАСТОЯЩЕЕ НАСТОЯЩЕЕ, это совсем другая история.

Итак, по крайней мере, в качестве expriment попробуйте переопределить интерфейсы репо, чтобы возвращать напрямую объекты, которые ему нужны, игнорируя, что является сущностью, какой объект является частью другого и так далее.

Затем приступайте к реализации конкретных проектов. Помните, что у вас столько моделей, сколько нужно приложениям. Только в тривиальных случаях есть одна модель для rule'm all

Смежные вопросы