куда поместить статический метод GetItems? + вопрос наследования - PullRequest
3 голосов
/ 22 марта 2011

У меня есть предмет:

public class Item {
    public long Id {get; protected set;}
    public string Name {get; protected set;}
}

и теперь я хочу добавить функцию, которая извлекает элементы из БД в соответствии с фильтрами. Это должен быть статический метод, который возвращает Item []:

public static Item[] GetItems(long? itemId, string itemName) {
    //Do Search in the db for items with Id=itemId (in case itemId is not null) and
    //with Name=itemName (in case itemName is not null)

    return itemsList.ToArray();
}

Вопрос в том, где этот метод поставить? 1. Должен ли я создать новый класс для этого? Как я буду называть этот класс? 2. я должен поместить этот метод в класс Item?

Еще один вопрос: В случае, если я хочу наследовать от класса Item. Как заставить дочерние классы реализовать такой метод GetItems?

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

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

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

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

1 голос
/ 22 марта 2011

GetItems (множественное число) для меня не похоже на то, что должно быть элементом Item (единственное число).Тем более, что пункт так прост.Я бы создал статический служебный класс (шаблон фабрики) с именем ItemUtility, который имеет GetItems.

Чтобы ответить на ваш второй вопрос: если класс наследует от Item, он также наследует любые конкретные реализации его члена.Таким образом, если бы был метод LoadItem для Item, и я создал SpecialItem: Item, то SpecialItem.LoadItem () фактически был бы просто кодом Item.LoadItem ().Если вы хотите сделать Item.LoadItem () перезаписываемым, вы можете использовать для метода модификатор «virtual» (что даст SpecialItem возможность самостоятельно выполнять действия с этим методом).

Item также может бытьабстрактный класс, если вы только собираетесь использовать его в качестве базового класса для других более сложных классов, таких как SpecialItem.

Другой вариант - создать интерфейс IItem и создать LoadItem (и любой другой обязательный член)часть определения интерфейса.

0 голосов
/ 22 марта 2011

Есть ли какая-то конкретная причина, по которой вы хотите сделать метод статичным? Если вы хотите наследовать метод GetItems в своих дочерних классах, вы не можете сделать его статическим. Чтобы ответить на ваши вопросы по порядку:

1) Да. Создайте новый класс, называемый чем-то вроде ItemManager, который выполняет фактический вызов уровня DB для получения Предметов. Таким образом, вы отделяете свой код доступа к данным от бизнес-логики

2) Вы должны создать метод в Item Class, который вызывает метод в ItemManager для получения фактических данных.

3) Пометьте метод, созданный на шаге 2, как виртуальный, если вы хотите, чтобы дочерние классы переопределяли метод для обеспечения собственной реализации. Если вы хотите заставить их переопределить и не нуждаются в реализации в самом базовом классе, пометьте базовый класс как абстрактный, чтобы дочерний класс должен его переопределить

0 голосов
/ 22 марта 2011

Доступ к данным должен идти в отдельном классе. Доступ к данным должен храниться на отдельном уровне, нежели определение объекта, в соответствии с концепцией разделения проблем.

Если вы хотите заставить все унаследованные объекты реализовывать метод, вы можете сделать его абстрактным.

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