Базовый класс с общими полями и функциями хорошего дизайна
У меня есть 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 ответ
В этом конкретном случае я бы сказал нет. Это не хороший дизайн. Чтобы даже заставить это работать правильно, каждый вызов метода в каждом классе должен сначала получить блокировку на syncObj
чтобы не испортить состояние из-за нескольких потоков, конкурирующих за один и тот же ресурс. Игнорируя потенциальное влияние на производительность, которое может возникнуть из-за этого, вы не сможете заставить свои производные классы работать независимо, потому что все они используют один и тот же "материал".
Я определенно рекомендую в этом случае использовать методы экземпляра. Если вы все еще хотите, чтобы ваш индивидуальный класс использовал тот же SqlConnection
или что-то еще затем передать его в класс с помощью внедрения зависимости.