Как мне получить доступ к DAL другого модуля?

Итак, у меня есть пара модулей в моем приложении. Один называется ProductCatalogue, а другой называется Contracts. Теперь у нас есть потребность в том, чтобы контракт был связан с рядом продуктов (например, с продуктами, которые разрешено заказывать одной из сторон контракта). В модуле ProductCatalogue у нас есть класс ProductDAL, который имеет следующие функции

Public Function GetProducts()
    Set GetProducts = GenerateProductsList("SOME SQL")
End Function

Private Function GenerateProductsList(selectQuery)
    Dim list : Set list = New List
    Dim results : results = GetResultsFromDB(selectQuery)
    '... for each row
        Dim product : Set product = New Product
        product.Id = results(field, index)
        list.Add(product)
    'loop ...
    Set GenerateProductsList = list
End Function

Теперь я хочу получить все продукты, связанные с контрактом, поэтому я хочу написать функцию, которая выглядит следующим образом

Public Function GetProductsForContract(contractId)
    Set GetProductsForContract = GenerateProductsList("SOME SQL")
End Function

У меня вопрос, где я должен поставить эту функцию? Я хочу использовать существующую функцию GenerateProductsList(), поскольку она намного сложнее, чем кажется. Там мой вопрос "Где я должен положить GetProductsForContract"?

Мои варианты:

1) Поместите это в ProductDAL.
Проблема в том, что ProductDAL внезапно узнает, что такое контракт, и я вижу, как он быстро заполняется такими функциями, как GetProductsForAllContracts, GetProductsForLiveContracts и т. Д., И т. Д. (И более, когда другие модули хотят получить доступ к продуктам), поэтому я действительно хотел бы сохранить эти функции с остальной частью кода контрактов.

2) Поместите его в ContractDAL и сделайте ProductDAL.GenerateProductsList общедоступным.
Должен ли я действительно разоблачать это?

3) Создайте новый класс, один метод которого несет единоличную ответственность за получение набора данных SQL и возврат списка продуктов.
На самом деле это не то же самое, что 2?

4) Хватит делать это неправильно.
Я не уверен как. Покажи мне. Тогда обними меня.

Редактировать: Кроме того, как насчет AddProductToContract, RemoveProductFromContract куда это идет? Я склоняюсь к новому классу ContractProductManager, но как лучше всего получить доступ к GenerateProductsList()

1 ответ

Решение

На это сложно ответить, не зная больше о вашем приложении. Я бы сказал, что если продукты и контракты находятся в одной базе данных и всегда будут, наличие двух DAL кажется произвольным разделением. Поскольку у вас, вероятно, уже есть связь между продуктом и контрактом в базе данных, вы ничего не выиграете от разделения двух в DAL. Вы можете поместить этот новый метод в любой класс, imho.

Другие вопросы по тегам