Базовый класс с общими полями и функциями хорошего дизайна - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть BaseDataClass с общими полями и функциями

    Protected Shared dbase as SqlDatabase
    Protected Shared dbCommand as DBCommand
    ...
    //also have a sync object used by the derived classes for Synclock'ing
    Protected Shared ReadOnly syncObj As Object = New Object()

    Protected Shared Sub Init() //initializes fields, sets connections 
    Protected Shared Sub CleanAll() //closes connections, disposes, etc.

У меня есть несколько классов, производных от этого базового класса. Производные классы имеют все Shared функции, которые можно вызывать непосредственно из BLL без создания экземпляров.
Функции в этих производных классах вызывают базовый метод Init (), вызывают их конкретные сохраненные процедуры, вызывают базовый метод CleanAll () и затем возвращают результаты.

Итак, если у меня есть 5 производных классов с 10 функциями каждый, всего 50 возможных вызовов функций, поскольку все они Shared, CLR вызывает только один вызов за раз, верно? Все вызовы стоят в очереди, чтобы дождаться завершения каждой функции Shared.

Есть ли лучший дизайн, в котором есть Shared функции в вашем DAL и все еще есть функции базового класса? Или, поскольку у меня есть базовый класс, лучше перейти к методам экземпляра в DAL?

1 Ответ

0 голосов
/ 23 апреля 2010

В этом конкретном случае я бы сказал нет. Это не хороший дизайн. Чтобы даже заставить это работать правильно, каждый вызов метода в каждом классе должен сначала получить блокировку на syncObj, чтобы не повредить состояние из-за нескольких потоков, конкурирующих за один и тот же ресурс. Игнорируя потенциальное влияние на производительность, которое может возникнуть из-за этого, вы не сможете заставить свои производные классы работать независимо, потому что все они используют один и тот же «материал».

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

...