Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Domain в нескольких сборках 
:(
    Опции темы
AntiInt
Дата 11.3.2014, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Всем привет!
Недавно собеседовал человека.
Кандидат мне заявил, что можно Domain(я про DDD) разбить на несколько сборок(при условии, что сущности в них не связаны).
Я подумал, да можно, в принципе.
Но как-то это странно выглядит, еще ни в одном проекте такого не видел, чтобы домен был представлен несколькими сборками.
Что вы думаете по поводу разбиения домена на несколько сборок?
PM MAIL   Вверх
jonie
Дата 11.3.2014, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



А в чем собственно проблема... DDD это логическое разбиение, никто не мешает физически размещать хоть по классу на сборку.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
AntiInt
Дата 11.3.2014, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Jonie, да, никто не мешает, я согласен и что разместить можно тоже согласен.
Но как ни странно, я ни разу не видел проекты, чтобы такое разбиение(физическое) происходило.
Меня это заинтересовало.
А вообще вопрос возник из того, что я спросил у кандидата
правильна ли будет запись class A:I,B(где I - это интерфейс)
на это кандидат ответил, что такое знать необязательно, ибо есть компилятор.
я спросил, а если проект будет компилироваться 20 минут?
он ответил, тогда для удобства компиляции разобьем вот на несколько сборок домен.
я подумал, почему бы и не разбить - ничему это не противоречит, но за свою практику такого не припомнил.
PM MAIL   Вверх
jonie
Дата 11.3.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(AntiInt @  11.3.2014,  12:10 Найти цитируемый пост)

А вообще вопрос возник из того, что я спросил у кандидата
правильна ли будет запись class A:I,B(где I - это интерфейс)

какой-то унылый вопрос, джуниорный... и вообще жутко выводящие из себя вопросы вида "будет ли компилироваться".

Цитата(AntiInt @  11.3.2014,  12:10 Найти цитируемый пост)
Но как ни странно, я ни разу не видел проекты, чтобы такое разбиение(физическое) происходило.

я видел и далеко не один, особо в компаниях где над проектом работают не одна группа разрабов.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
AntiInt
Дата 11.3.2014, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Ну искали и жуниора...
Просто чтобы было правильно понятно, допустим структура проекта такая(по сборкам):
Project.Domain
Project.Data
Project.Client

я ни разу не видел, даже в больших проектах, чтобы сборку Project.Domain дробили на Project.Domain1, Project.Domain2 и т.д.
Я не отрицаю что это возможно, и не говорю, что это неправильно, просто вот не видел такого почему-то... хотя и принимал участие в больших проектах.

погуглил
http://stackoverflow.com/questions/2054306...assemblies?rq=1
тут этим недовольны товарищи программисты.

Я в этом ниче такого не вижу, но т.к. не сталкивался с таким разбиением на практике, смущает.
Вот когда такое разбиение оправдано?

Это сообщение отредактировал(а) AntiInt - 11.3.2014, 12:04
PM MAIL   Вверх
dzaraev
Дата 11.3.2014, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(AntiInt @  11.3.2014,  12:00 Найти цитируемый пост)
тут этим недовольны товарищи программисты.

Тут вроде бы не о сборках речь, а о разделении самого домена на составляющие (логически).

Цитата(AntiInt @  11.3.2014,  12:00 Найти цитируемый пост)
Вот когда такое разбиение оправдано?

Вообще сборки - это физическое представление структуры решения. А логическим являются неймспейсы.
Соответственно разделение на сборки будет оправдано тогда, когда требуется физически разнести код на модули - например та же компиляция, или вам необходимо во время выполнения подключать дополнительные части домена (возможно написанные сторонними разрабами), или у вас какой-нибудь мега-тонкий клиент, который тянет с сети только самые необходимые сборки, остальные - по мере надобности.
Имхо - физически можно делить хоть как, зависит от соответствующих требований, а логически - можно весь домен содержать в одном неймспейсе (например MyPropject.Domain), тип размещенный в неймспейсе MyProject.Domain.Department1 - соответственно тоже относится к домену. Тип из MyProject.Data - относится уже к данным, даже если лежит с доменными типами в одной сборке\файле.
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
AntiInt
Дата 11.3.2014, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



тут как раз писалось вот "I want to put each of which sub domains into a separate assembly (I wanna split it into 1st:vertical 2nd: horizontal  modules => easy reusability)."
Если смотреть в терминах ddd, то разделение возможно на контексты, а тут по сборкам разнести.
По остальным пунктам с Вами согласен(на данный момент не встречал такое в проектах, видать не было необходимости в таком дроблении).
И по поводу подгружаемых сущностей, которые написаны сторонними разрабами - тут спорный вопрос, т.к. это уже получается система плагинизации, а следовательно интерфейсы подгружаемых объектов уже есть в домене.
И что касается тонкого клиента - тут есть более правильное решение(описано у рихтера) по поводу подгружаемых сущностей - использование сборок состоящих из нескольких объектных модулей
(файлы с расшиением .netmodule) они как раз и используются для динамической подгрузки, хотя и длл можно подгрузить...
другой вопрос стоит ли делить сборку Project.Domain на сборки Project.Domain1 и Project.Domain2 только из-за компиляции?
PM MAIL   Вверх
dzaraev
Дата 12.3.2014, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(AntiInt @  11.3.2014,  15:08 Найти цитируемый пост)
тут как раз писалось вот "I want to put each of which sub domains into a separate assembly

Виноват, не увидел.

Цитата(AntiInt @  11.3.2014,  15:08 Найти цитируемый пост)
получается система плагинизации, а следовательно интерфейсы подгружаемых объектов уже есть в домене.

Плагины - это частный случай.

Цитата(AntiInt @  11.3.2014,  15:08 Найти цитируемый пост)
И что касается тонкого клиента - тут есть более правильное решение(описано у рихтера) 

Согласен, не очень удачный пример, хотя опять же зависит от приложения - если вы в сервисе влк\выкл отдельные большие фичи, то возможно удобней вообще не деплоить сборку (и не показывать лишних метаданных).

Кстати говоря про компиляцию - нетмодули тут тоже могут помочь, т.к. могут быть скомпилены по-отдельности (читай - параллельно) и затем слинкованы, также можно шибко шареный и больошй код компилить в отдельный модуль и затем линковать во все сборки, где он нужен, а не компилить много раз для каждой сборки. Но прежде, чем так изголяться, мне кажется надо провести соответствующие замеры - стоит ли овчинка выделки, т.к. в Студии по-моему модули не поддерживаются вообще, так что придется шаманить с собственными msbuild-тасками и работать непосредственно с компиляторами и линкером. Плюс с версиями больше заморочек. Если полученный выигрыш во времени компиляции того не стоит - нафиг надо ))

Это сообщение отредактировал(а) dzaraev - 12.3.2014, 06:35
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
AntiInt
Дата 12.3.2014, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Да, студия нетмодули не поддерживает, тут надо AL.exe, придется мсбилд или нант использовать.
А разве метаданные будут видны если нетмодуль не прилинкован? нетмодуль же сам содержит метаданные и код.
Все же давайте вернемся к теме,
на сколько оправдано дробление домена и вообще нужно ли оно?
Или же допостовляемые сущности - это уже контекст, который может и должен быть в отдельной сборке.
PM MAIL   Вверх
dzaraev
Дата 12.3.2014, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(AntiInt @  12.3.2014,  08:16 Найти цитируемый пост)
А разве метаданные будут видны если нетмодуль не прилинкован? нетмодуль же сам содержит метаданные и код.

Если не прилинкован - не будут, но вы же предлагали сценарий где грузятся нетмодули с сервера - они-то уже слинкованы, и все метаданные со всех модулей будут известны по манифесту сборки, который в любом случае обязательно будет загружен в вашем сценарии, иначе CLR не будет знать - где какие типы лежат в каких модулях. Сам нетмодуль содержит только  метаданные своих типов и ссылки на другие модули, если юзает их типы. Манифест сборки содержит метаданные по всем типам и в каких модулях они лежат и ссылки на все нетмодули, он исчерпывающе описывает всю сборку, даже если она разбита на файлы и он обязательно будет сразу загружен с сервера, чтобы clr могла вообще работать с данной сборкой.

Цитата(AntiInt @  12.3.2014,  08:16 Найти цитируемый пост)
Все же давайте вернемся к теме,
на сколько оправдано дробление домена и вообще нужно ли оно?

По теме я ответил (касательно компиляции):
Цитата

надо провести соответствующие замеры
...
Если полученный выигрыш во времени компиляции того не стоит - нафиг надо


Подробнее не подскажу, в теории DDD не силён. Скажу только, что разбивать что-то большое на составляющие - это общее эмпирическое правило в программировании. И еще напомню - что сборки тут не при чем (ИМХО), это физический уровень (точнее логическая организация физического представления вашей программы). Нужно решать физ. задачу - шаманьте со сборками\нетмодулями. Нужно логически отделить мух от котлет - неймспейсов вполне достаточно.
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.