Я только начинаю работать с .NET ORM, до такой степени, что еще даже не выбрал между Entity Framework и NHibernate. Но в обоих случаях я сталкиваюсь с проблемой, заключающейся в том, что они, похоже, хотят, чтобы я различными способами скомпрометировал целостность моей модели предметной области, особенно в тонкостях проектирования объектов C#. Это один из нескольких вопросов по теме.
Существует причина, по которой virtual
не используется по умолчанию для методов C#. Объекты в моей модели предметной области не готовы давать обещания о поведении подклассов, за исключением очень специфических случаев, когда я помечаю их как таковые. Иными словами, для очень немногих методов объектов моего домена уместно добавить хук для неопределенной новой функциональности.
Тем не менее, NHibernate хочет, чтобы я сделал все virtual
, а Entity Framework хочет, чтобы я сделал все ссылки на сущности virtual
. Я понимаю, зачем им это нужно (для создания прокси-объектов), и я понимаю, что на самом деле это законное использование наследования и virtual
--- они на самом деле подключаются к моим свойствам, чтобы добавить новую функциональность. Но меня раздражает, что я должен аннотировать свои классы модели предметной области чем-то, что полностью связано с постоянством, а вовсе не с выражением их фактического контракта с реализаторами и потребителями.
В качестве небольшой проблемы, с которой я, как я понимаю, ничего не могу поделать, часто бывает выразительно аннотировать мои классы с помощью sealed
по всем обычным причинам. Однако это немного менее неприятно, поскольку исключение аннотации из моих объектов домена с целью сохранения кажется менее плохим, чем ее добавление.
Разочаровывает то, что после нескольких лет чтения таких книг, как Effective C#, или блогов, таких как блоги Эрика Липперта, которые дают отличные советы о том, как проектировать выразительные и пуленепробиваемые объекты C#, необходимость использовать ORM заставляет меня бросать большая часть этих знаний вылетела из окна. Я надеюсь, что кто-то здесь может указать, где я ошибаюсь, либо в моем понимании их возможностей, либо в моих мыслях о моделировании предметной области и роли ORM.
virtual
был по умолчанию (для методов), и я могу сосчитать, сколько раз у меня былsealed
класс на пальцах: Если вы создадите подкласс и что-то сломаете, это ваша вина< /i> :-) Я столкнулся со слишком большим количеством негибкого кода (из других библиотек), который я не могу хорошо использовать и не могу изменить. - person   schedule 19.03.2011