Какой дизайн шаблона предлагается здесь? - PullRequest
0 голосов
/ 19 мая 2009

У меня есть 2 таблицы, сейчас, например, ClientOrder и Products Table. Используя Linq, я смог написать все запросы, которые я хочу выполнить 1. Поиск по заказу клиента 2. Поиск по имени клиента 3. Поиск по названию товара 4. Поиск по номеру товара

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

Разумнее ли просто создать статический класс с помощью 4 статических методов?

Примечание: я 5 месяцев в мире программирования и новичок

Ответы [ 5 ]

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

Прежде всего, давайте рассмотрим намерение для шаблона метода Factory:

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

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

ИМХО, я бы избежал любой альтернативы реализации, которая включает статический класс / метод: вы не можете наследовать от статического класса, поэтому вы ограничиваете расширяемость вашей модели. То же самое касается статических методов в нестатических классах: они не могут быть переопределены в подклассах.

Я бы не стал добавлять эти методы запросов к объектам вашего домена. Учитывая, что вы используете ООП для моделирования реального мира, имеет ли смысл просить Орден искать другие ордера?

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

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

Обычно такие объекты (которые сохраняют или извлекают другие объекты) называются хранилищами. В вашем случае он может быть назван ClientOrderRepository. Что бы сделал этот объект? Ну, вы уже упомянули об этом: выполните четыре различных запроса, которые вам нужны. Давайте посмотрим на возможное определение его интерфейса:

public interface IClientOrderRepository {
    ClientOrder FindOrderWithIdMatching(int anOrderId);
    ClientOrder FindOrderWithClientNameMatching(string aClientName);
    ClientOrder FindOrderWithProductNameMatching(string aProductName);
    ClientOrder FindOrderWithProductIdMatching(string aProductId);
}

Если вам нужен только один экземпляр класса, который будет реализовывать этот интерфейс, вы можете использовать шаблон Singleton. Не полагайтесь на варианты реализации (такие как статические методы), которые могут быть трудно изменить позже.

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

Более подробная информация о шаблоне репозитория приведена ниже.

2 голосов
/ 19 мая 2009

Мне показалось, что Шаблоны архитектуры корпоративных приложений Мартина Фаулера полезны в изучении того, как люди структурируют доступ к таблицам базы данных. Некоторые из этих шаблонов перечислены здесь .

Для вашей более простой задачи один класс с четырьмя статическими методами звучит вполне разумно. Но вы должны рассмотреть шаблон Fowler Table Data Gateway, где вы упаковываете весь доступ к каждой таблице в свой класс статических методов (и используете стандартное соглашение об именах).

2 голосов
/ 19 мая 2009

Если вы не знаете, какой шаблон дизайна вам следует использовать, лучше не используйте его! В этом очень простом случае я не могу придумать ни одного полезного дополнения, которое мог бы предоставить какой-либо шаблон дизайна. Возможно, вы просто хотите узнать, как можно реализовать функции для управления этими четырьмя запросами и их результатами?

1 голос
/ 19 мая 2009

Предлагаю расширить классы статическими методами. Что-то вроде следующего.

IEnumerable<Client> Client.GetByName(String Name) { }

IEnumerable<Product> Product.GetByName(String Name) { }

Product Product.GetById(Guid Id) { }

Я предполагаю, что вы используете LINQ to SQL или LINQ to Entity, так что вы можете просто расширить сгенерированные частичные ошибки. Если вы возвращаете коллекции или экземпляр, и если вы выбираете IEnumerable, IQueryable, IList, List или что-то еще, зависит от ваших потребностей.

0 голосов
/ 19 мая 2009

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

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