Попробуйте представить это иначе. Не абстракция над EF, а класс с помощью EF реализующий контракт бизнес уровня на доступ к данным.
Если вы изначально проектируете от доменного уровня, вам вообще не важно, EF там или файлы с json вычитываются с SMB шары. Домен просто хочет IUserDataStore. И что прикольно, пока в начале проекта вы пишете доменный уровень — у вас в тестах на моках всё будет крутиться безо всяких EF и в принципе баз данных.
Использовать интерфейс описанный в EF — не значит абстрагироваться от EF. Этот интерфейс нужен был разработчикам EF для их внутренних целей(например позволить в будущем менять конкретные типы возвращаемые за ним), а не для того чтобы его кто-то другой реализовывал.
Никакой домен не должен ссылаться на EF.Abstractions, потому что с точки зрения домена нет EF, есть рейсы, покупатели, брони и прочие скидки.
Честная слоёная архитектура подразумевает сильную избыточность. Вы же хотите срезать углы на каждом повороте. Так не бывает. У вас либо честные слои, разрезанная ответственность и тестируемость в изоляции и сильная избыточность кода, либо макароны из зависимостей на какие то библиотеки в домене, но зато быстрая разработка.
На крупных кроссплатформенных проектах ничего подобного в принципе не позволительно. Любая зависимость на внешнюю систему (EF в вашем случае) ОБЯЗАТЕЛЬНО абстрагируется архитектурным швом. Потому что нет никаких гарантий что на платформе X она в принципе поддерживается. Верить можно в libc и изредка в pthreads. Хотя хардварщики наверное и тут плюнули бы мне в лицо :)
Почитайте немного про кольцевые архитектуры (типа Clean Architecture, но она не единственная), и про Dependency Inversion.
Окей, вот представьте, вы работаете в HP, в отделе выбора поставщиков.
Какие процедуры верификации вы бы придумали не зная об этом конкретном случае, чтобы его предотвратить?
Банка с луком на окне звучит как чудо инженерно-гидропонной мысли. Были еще какие нибудь изобретения от бабушки? Например где взять денег на дачу в 10км от города по-быстрому.
Главное не забыть социальное лечение ожирения и сердечно сосудистых заболеваний. Автомобиль очень неявно их провоцирует, особенно в странах где это основной способ передвижения.
Чувство свободы 7 миллиардам людей дать не получится. Чтобы кто-то жил красиво, кто-то должен жить скромно. Хотя я бы посмотрел на Мумбаи или Шанхай где у всех жителей есть социальное авто. Дышать там давно нечем (слетайте, вдохните аромат свободы), но еще и людям места не хватит, авто в карман не влазит.
Это болезнь многих хардварщиков из госконтор. Им не платят нифига, а делают они довольно интересные штуки сражаясь с тупостью системы. В итоге там тяжелые комплексы неполноценности и глубокая обида на пацанов что вышли из ВУЗа, и слёту получают 2 зряплаты хардварных ребят просто сидя в офисе нажимая на кнопочки и программируя под хайповый мейнстрим.
Ну во первых у AOT компилятора МОЖЕТ быть PGO. Другой вопрос заморочился ли разработчик со сбором.
Во вторых — PGO нужен для линейной раскладки бинаря. Но главное что AOT может увидеть и размотать что нибудь, или векторизовать, чего JIT точно не будет делать.
А что странного что отсутствие компиляции в рантайме ускоряет запуск?
И что странного в том что AOT компиляция может выдавать намного более оптимальный выхлоп, не будучи ограниченной по времени?
Большинство людей банально марафон не могут пробежать по прямой, даже при скорости 7-8км в час. Не говоря уже о том что согласно вашей идее его можно бегать по горам с тем же успехам, энергия ведь как вы говорите, сохраняется.
Живой организм не выдерживает сильные перегрузки, имеет тенденцию уставать, ему необходим сон, у него случаются срывы на фоне нагрузок. Собственно этим он и отличается от механизмов (у них тоже есть износ, но он чуть иначе проявляется).
Ну если конкретно про птиц и людей — попробуйте пройти дорогу от дома до работы по ступенькам. Влево — вверх, вправо — вниз. Просто разложите маршрут где вместо бокового перемещения будет вертикальное. После этого утверждение про эквивалентность в отношении птиц уже будет не таким очевидным.
Если вы изначально проектируете от доменного уровня, вам вообще не важно, EF там или файлы с json вычитываются с SMB шары. Домен просто хочет IUserDataStore. И что прикольно, пока в начале проекта вы пишете доменный уровень — у вас в тестах на моках всё будет крутиться безо всяких EF и в принципе баз данных.
Никакой домен не должен ссылаться на EF.Abstractions, потому что с точки зрения домена нет EF, есть рейсы, покупатели, брони и прочие скидки.
Честная слоёная архитектура подразумевает сильную избыточность. Вы же хотите срезать углы на каждом повороте. Так не бывает. У вас либо честные слои, разрезанная ответственность и тестируемость в изоляции и сильная избыточность кода, либо макароны из зависимостей на какие то библиотеки в домене, но зато быстрая разработка.
На крупных кроссплатформенных проектах ничего подобного в принципе не позволительно. Любая зависимость на внешнюю систему (EF в вашем случае) ОБЯЗАТЕЛЬНО абстрагируется архитектурным швом. Потому что нет никаких гарантий что на платформе X она в принципе поддерживается. Верить можно в libc и изредка в pthreads. Хотя хардварщики наверное и тут плюнули бы мне в лицо :)
Почитайте немного про кольцевые архитектуры (типа Clean Architecture, но она не единственная), и про Dependency Inversion.
Какие процедуры верификации вы бы придумали не зная об этом конкретном случае, чтобы его предотвратить?
Чувство свободы 7 миллиардам людей дать не получится. Чтобы кто-то жил красиво, кто-то должен жить скромно. Хотя я бы посмотрел на Мумбаи или Шанхай где у всех жителей есть социальное авто. Дышать там давно нечем (слетайте, вдохните аромат свободы), но еще и людям места не хватит, авто в карман не влазит.
Вот и получается текст с вкраплениями обидки :)
Нарушено только одно из условий, но этого достаточно
Во вторых — PGO нужен для линейной раскладки бинаря. Но главное что AOT может увидеть и размотать что нибудь, или векторизовать, чего JIT точно не будет делать.
И что странного в том что AOT компиляция может выдавать намного более оптимальный выхлоп, не будучи ограниченной по времени?
Про разные вещи (последний абзац):
https://habrahabr.ru/post/232169/#comment_7873817
И в целом — https://www.youtube.com/watch?v=DgdP5U28jHc
Живой организм не выдерживает сильные перегрузки, имеет тенденцию уставать, ему необходим сон, у него случаются срывы на фоне нагрузок. Собственно этим он и отличается от механизмов (у них тоже есть износ, но он чуть иначе проявляется).
К технике вопросов нет :)