Я только начинаю с .NET ORM, до того момента, когда я даже не решил между Entity Framework и NHibernate. Но в обоих случаях у меня возникает проблема в том, что они, похоже, хотят, чтобы я скомпрометировал целостность моей модели домена различными способами, особенно в тонких точках дизайна объектов С#. Это один из нескольких вопросов по этому вопросу.
Существует причина virtual
не является значением по умолчанию для методов в С#. Объекты моей модели домена не готовы сделать promises о поведении подклассов, за исключением особых случаев, когда я отмечаю их как таковые. Другими словами, для очень немногих методов в моих объектах домена целесообразно добавить крючок для неопределенной новой функциональности.
Но NHibernate хочет, чтобы я сделал все virtual
, и Entity Framework хочет, чтобы я сделал все ссылки на сущности virtual
. Я понимаю, зачем им это нужно (для создания прокси-объектов), и я понимаю, что это на самом деле законное использование наследования и virtual
--- они фактически подключаются к моим свойствам, чтобы добавить новые функции. Но это на меня нападает, что я должен аннотировать классы моей модели домена с чем-то, что полностью связано с настойчивостью, и вовсе не выражает их фактический контракт с исполнителями и потребителями.
В качестве более мелкой проблемы, которая, как я понимаю, я, вероятно, ничего не могу сделать, часто выразительно комментировать мои классы с помощью sealed
по всем обычным причинам. Это немного меньше решетки, хотя, поскольку исключение аннотации из моих объектов домена для целей настойчивости кажется менее плохим, чем добавление одного.
Неудивительно, что после нескольких лет чтения таких книг, как Effective С# или блоги, таких как Eric Lippert, которые дают отличный совет по разработке выразительных и пуленепробиваемых объектов С#, необходимость использования ORM заставляет меня бросить большую часть этих знаний из окна. Я надеюсь, что кто-то здесь может указать, где я ошибаюсь, либо в своем понимании своих возможностей, либо в моих мыслях о моделировании домена и роли ORM.