LINQ к SQL вынуждает Вас использовать шаблон таблицы в классе. Преимущества использования этого шаблона - то, что это быстро и легко реализовать, и это прилагает очень мало усилий для получения домена, работающего на основе существующей структуры базы данных. Для простых приложений это совершенно приемлемо (и часто даже предпочтительно), но для более сложных приложений devs будет часто предлагать использовать домен управляемый шаблон дизайна вместо этого (который является тем, что NHibernate упрощает).
проблема с шаблоном таблицы в классе состоит в том, что Ваша структура базы данных имеет непосредственное влияние по Вашему доменному дизайну. Например, скажем, у Вас есть таблица Customers со следующими столбцами для содержания основной адресной информации клиента:
Теперь, скажем, Вы хотите добавить столбцы для почтового адреса клиента также, таким образом, Вы добавляете в следующих столбцах к таблице Customers:
Используя LINQ к SQL, Потребительский объект в Вашем домене теперь имел бы свойства для каждого из этих восьми столбцов. Но если бы Вы следовали за доменом управляемый шаблон разработки, Вы, вероятно, создали бы Класс адресов и имели Ваш Потребительский класс, содержат два свойства Address, один для почтового адреса и один для их текущего адреса.
Это - простой пример, но он демонстрирует, как шаблон таблицы в классе может привести к несколько вонючему домену. В конце, Вам решать. Снова, для простых приложений, для которых просто нужен основной CRUD (создают, считайте, обновите, удалите), функциональность, LINQ к SQL идеален из-за простоты. Но лично мне нравится использовать NHibernate, потому что он упрощает более чистый домен.
Редактирование: @lomaxx - Да, пример, который я использовал, был упрощен и, возможно, был оптимизирован для работы хорошо с LINQ к SQL. Я хотел сохранить его максимально основным, чтобы убедительно доказать точку зрения. Точка остается, хотя это там - несколько сценариев, где наличие Вашей структуры базы данных решает, что Ваша доменная структура была бы плохой идеей, или по крайней мере привела бы к субоптимальному дизайну OO.
Указатель объекта типа используется для представления типа объекта. Это необходимо для:
Type
, если вы вызываете GetType
. Поле синхроблока является в основном используется для запирания. Он заполняется только тогда, когда это необходимо, и когда блокировка всегда не оспаривается, CLR обходится «тонкой» блокировкой, которая не требует никаких внешних данных. Иначе, это запись в таблице для всего процесса - я не знаю подробностей о том, что находится в таблице, но я могу представить, что это что-то вроде списка потоков, ожидающих на мониторе объекта. Конечно, наиболее важной информацией является то, удерживается ли блокировка в данный момент, каким потоком и каково ее количество (из-за реентерабельной природы блокировок .NET).
Блок синхронизации также заполняется, если вы вызовите GetHashCode ()
, и он не переопределяется - в основном он использует таблицу для всего процесса для выделения стабильного номера. (Адреса объекта недостаточно, так как он может меняться со временем.)
Блок синхронизации также заполняется, если вы вызовите GetHashCode ()
, и он не переопределен - в основном, он использует таблицу для всего процесса для выделения стабильного номера. (Адреса объекта недостаточно, так как он может меняться со временем.)
Блок синхронизации также заполняется, если вы вызовите GetHashCode ()
, и он не переопределен - в основном, он использует таблицу для всего процесса для выделения стабильного номера. (Адреса объекта недостаточно, так как он может меняться со временем.)
Объект типа - это то, что возвращает obj.GetType call
блок синхронизации, используемый для синхронизации
См .:
Индекс блока синхронизации используется под капотом классом Monitor и, следовательно, оператором блокировки.