2010-04-22 2 views
0

У меня 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?

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^