Структура проектов .Net
От: Daimond Россия  
Дата: 18.07.06 06:53
Оценка:
Добрый день!

Пишу типичное приложение:

Первая сборка

Уровень данных + уровень бизнес-логики =>
default namespace = MyApplication
соответственно, сборка под именем MyApplication, файл MyApplication.dll
содержит namespace MyApplication.DataLayer и MyApplication.Domain,
является ClassLibrary


Вторая сборка

Формочки + все, что касается GUI =>
default namespace = MyApplication.Forms
соответственно, сборка под именем MyApplication.Forms, файл MyApplication.Forms.exe



При такой структуре получается исполняемый файл "MyApplication.Forms.exe", что вообщем-то не очень красиво, красиво было бы "MyApplication.exe".

Какая структура проектов у вас? Или имя файла "MyApplication.Forms.exe" можно считать приемлемым (вдруг в будущем появится "MyApplication.Console.exe") ?

Переносить точку входа в приложения в первую сборку не правильно, т.к добавит связей между GUI и предметной области, чего хотелось бы избежать.

Называть первую сборку MyApplication.Domain, а вторую MyApplication, как-то не логично. Да и сборок с разными GUI может быть много.

Господа, какие есть варианты?
Re: Структура проектов .Net
От: NoiseMaker  
Дата: 18.07.06 07:07
Оценка:
Если не нравится автоматически сгенерированное студией имя exe-файла, измени его в настройках проекта.
А структура проекта нормальная...
Re[2]: Структура проектов .Net
От: Daimond Россия  
Дата: 18.07.06 07:17
Оценка:
Здравствуйте, NoiseMaker, Вы писали:

NM>Если не нравится автоматически сгенерированное студией имя exe-файла, измени его в настройках проекта.

NM>А структура проекта нормальная...

Где? Я могу изменить имя сборки, но если я изменю ее на MyApplication (чтобы у меня имя exe-файла было MyApplication.exe), это будет конфликтовать с моей первой сборкой (как ты помнишь она тоже имеет имя MyApplication). Может я не нашел чего? Как изменить имя exe-файла не меняя имени сборки? А вообще токое правильно???
Re[3]: Структура проектов .Net
От: Lloyd Россия  
Дата: 18.07.06 08:46
Оценка:
Здравствуйте, Daimond, Вы писали:

D>Где? Я могу изменить имя сборки, но если я изменю ее на MyApplication (чтобы у меня имя exe-файла было MyApplication.exe), это будет конфликтовать с моей первой сборкой (как ты помнишь она тоже имеет имя MyApplication). Может я не нашел чего? Как изменить имя exe-файла не меняя имени сборки? А вообще токое правильно???


Разбей Domain и DataLayer на две сборки.
Re[4]: Структура проектов .Net
От: Daimond Россия  
Дата: 18.07.06 10:19
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Daimond, Вы писали:


D>>Где? Я могу изменить имя сборки, но если я изменю ее на MyApplication (чтобы у меня имя exe-файла было MyApplication.exe), это будет конфликтовать с моей первой сборкой (как ты помнишь она тоже имеет имя MyApplication). Может я не нашел чего? Как изменить имя exe-файла не меняя имени сборки? А вообще токое правильно???


L>Разбей Domain и DataLayer на две сборки.


А что это решит?
Уровень Domain должен быть осведомлен об уровне DataLayer, чтобы знать КАК записывать себя в БД. Уровень DataLayer должен быть осведомлен об уровне Domain, чтобы знать ЧТО он должен записать в БД. Конечно, эта связь должна быть минимальна, но она будет. (Выход: использовать промежуточную сборку с интерфейсами, что не во всех проектах окупается). Покажи пример, как выглядит подобное разбиение.
Re[5]: Структура проектов .Net
От: Lloyd Россия  
Дата: 18.07.06 10:21
Оценка:
Здравствуйте, Daimond, Вы писали:

D>Уровень Domain должен быть осведомлен об уровне DataLayer, чтобы знать КАК записывать себя в БД. Уровень DataLayer должен быть осведомлен об уровне Domain, чтобы знать ЧТО он должен записать в БД. Конечно, эта связь должна быть минимальна, но она будет. (Выход: использовать промежуточную сборку с интерфейсами, что не во всех проектах окупается). Покажи пример, как выглядит подобное разбиение.


А зачем домену знать о том как его будут сохранять?
Re[6]: Структура проектов .Net
От: Daimond Россия  
Дата: 18.07.06 13:49
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Daimond, Вы писали:


D>>Уровень Domain должен быть осведомлен об уровне DataLayer, чтобы знать КАК записывать себя в БД. Уровень DataLayer должен быть осведомлен об уровне Domain, чтобы знать ЧТО он должен записать в БД. Конечно, эта связь должна быть минимальна, но она будет. (Выход: использовать промежуточную сборку с интерфейсами, что не во всех проектах окупается). Покажи пример, как выглядит подобное разбиение.


L>А зачем домену знать о том как его будут сохранять?


Он должен знать, ЧТО СДЕЛАТЬ, ЧТОБЫ СЕБЯ СОХРАНИТЬ.

Грубо говоря, объект предиетной области должен знать, что есть такой DataMapper в пространстве имен DataLayer, у этого DataMapperа есть метод SaveDomainObject(...) и если вызвать DataMapper.SaveDomainObject(this), то это его сохранит. Вот.

Предложи, пожалуйста, архитектуру с разносом DataLayer и Domain по разным сборкам, не используя промежуточную с интерфейсами.
Re[7]: Структура проектов .Net
От: ika Беларусь  
Дата: 19.07.06 17:05
Оценка:
Здравствуйте, Daimond, Вы писали:

D>Здравствуйте, Lloyd, Вы писали:


L>>Здравствуйте, Daimond, Вы писали:


D>>>Уровень Domain должен быть осведомлен об уровне DataLayer, чтобы знать КАК записывать себя в БД. Уровень DataLayer должен быть осведомлен об уровне Domain, чтобы знать ЧТО он должен записать в БД. Конечно, эта связь должна быть минимальна, но она будет. (Выход: использовать промежуточную сборку с интерфейсами, что не во всех проектах окупается). Покажи пример, как выглядит подобное разбиение.


L>>А зачем домену знать о том как его будут сохранять?


D>Он должен знать, ЧТО СДЕЛАТЬ, ЧТОБЫ СЕБЯ СОХРАНИТЬ.


D>Грубо говоря, объект предиетной области должен знать, что есть такой DataMapper в пространстве имен DataLayer, у этого DataMapperа есть метод SaveDomainObject(...) и если вызвать DataMapper.SaveDomainObject(this), то это его сохранит. Вот.


D>Предложи, пожалуйста, архитектуру с разносом DataLayer и Domain по разным сборкам, не используя промежуточную с интерфейсами.


Хм. IMHO, правильно — это чтобы DataLayer знал (зависел от) о Domain, наоборот — неверно. Следовательно, Domain никогда сам не вызывает сохранающий/загружающий его код. Вместо него это делает уровень бизнес-логики (то есть самый Forms.exe в виде обработки user actions).
Re[7]: Структура проектов .Net
От: Lloyd Россия  
Дата: 19.07.06 17:30
Оценка:
Здравствуйте, Daimond, Вы писали:

L>>А зачем домену знать о том как его будут сохранять?


D>Он должен знать, ЧТО СДЕЛАТЬ, ЧТОБЫ СЕБЯ СОХРАНИТЬ.


D>Грубо говоря, объект предиетной области должен знать, что есть такой DataMapper в пространстве имен DataLayer, у этого DataMapperа есть метод SaveDomainObject(...) и если вызвать DataMapper.SaveDomainObject(this), то это его сохранит. Вот.


D>Предложи, пожалуйста, архитектуру с разносом DataLayer и Domain по разным сборкам, не используя промежуточную с интерфейсами.


Легко. Entity — тупые как пробка, фактически просто DTO, Вся бизнес-логика сисредоточена в бизнес-слое, который и обращается к da-слою для загрузки/сохранения сущностей.
Re[8]: Структура проектов .Net
От: Daimond Россия  
Дата: 20.07.06 05:32
Оценка:
Здравствуйте, Lloyd, Вы писали:


D>>Предложи, пожалуйста, архитектуру с разносом DataLayer и Domain по разным сборкам, не используя промежуточную с интерфейсами.


L>Легко. Entity — тупые как пробка, фактически просто DTO, Вся бизнес-логика сисредоточена в бизнес-слое, который и обращается к da-слою для загрузки/сохранения сущностей.


Забавно, что образовалось два взаимоисключающих мнения (http://www.rsdn.ru/Forum/Message.aspx?mid=2013197&only=1
Автор: ika
Дата: 19.07.06
)

Реализовать такое будет возможно, только если дата-слой принимает мета-данные, описывающие КАК сохранить сущности (например, используя NHibernate или подобные мепперы). В противном случае, дата-слой должен знать, что если он принял объект Departament, то должен сохранить поля Name, Code и тд. в соответствующих полях таблицы DEPARTAMENTS, вызвать такие-то хранимки, исполнить такие-то запросы. Кто ему об этом скажет? Либо мета-данные, либо это должно быть в коде DataMappera, а значит слой данных становится зависим от Сущностей бизнес-логики.

Кинь какой-нть пример тупого как пробка Entity (элементарный, конечно) — меня давно эта тема интересует.
Re[8]: Структура проектов .Net
От: Daimond Россия  
Дата: 20.07.06 05:33
Оценка:
Здравствуйте, ika, Вы писали:

ika>Здравствуйте, Daimond, Вы писали:


D>>Здравствуйте, Lloyd, Вы писали:


L>>>Здравствуйте, Daimond, Вы писали:


D>>>>Уровень Domain должен быть осведомлен об уровне DataLayer, чтобы знать КАК записывать себя в БД. Уровень DataLayer должен быть осведомлен об уровне Domain, чтобы знать ЧТО он должен записать в БД. Конечно, эта связь должна быть минимальна, но она будет. (Выход: использовать промежуточную сборку с интерфейсами, что не во всех проектах окупается). Покажи пример, как выглядит подобное разбиение.


L>>>А зачем домену знать о том как его будут сохранять?


D>>Он должен знать, ЧТО СДЕЛАТЬ, ЧТОБЫ СЕБЯ СОХРАНИТЬ.


D>>Грубо говоря, объект предиетной области должен знать, что есть такой DataMapper в пространстве имен DataLayer, у этого DataMapperа есть метод SaveDomainObject(...) и если вызвать DataMapper.SaveDomainObject(this), то это его сохранит. Вот.


D>>Предложи, пожалуйста, архитектуру с разносом DataLayer и Domain по разным сборкам, не используя промежуточную с интерфейсами.


ika>Хм. IMHO, правильно — это чтобы DataLayer знал (зависел от) о Domain, наоборот — неверно. Следовательно, Domain никогда сам не вызывает сохранающий/загружающий его код. Вместо него это делает уровень бизнес-логики (то есть самый Forms.exe в виде обработки user actions).


Мне кажется, двусторонней связи можно избежать только используя мепперы на мета-данных.
См. http://www.rsdn.ru/Forum/Message.aspx?mid=2013569&only=1
Автор: Daimond
Дата: 20.07.06
Re: Структура проектов .Net
От: Daimond Россия  
Дата: 20.07.06 05:35
Оценка:
А все-таки так никто и не дал ответа на мой основной вопрос.
Неужели у все екзешники называются "MyApplication.Forms.exe" ???
Re[2]: Структура проектов .Net
От: Andrbig  
Дата: 20.07.06 06:31
Оценка:
Здравствуйте, Daimond, Вы писали:

D>А все-таки так никто и не дал ответа на мой основной вопрос.

D>Неужели у все екзешники называются "MyApplication.Forms.exe" ???

Нет, просто datalayer не называется MyApplication.dll. Какой это нахрен application, если это datalayer?
Re[9]: Структура проектов .Net
От: ika Беларусь  
Дата: 20.07.06 07:13
Оценка:
Здравствуйте, Daimond, Вы писали:

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

D>См. http://www.rsdn.ru/Forum/Message.aspx?mid=2013569&only=1
Автор: Daimond
Дата: 20.07.06


Какая двусторонняя связь? Какие мапперы? Какие метаданные?
Расставьте между компонентами правильные зависимости! И все! Нефиг городить.



BO и DAL компоненты кладешь либо в одну сборку либо в разные (совершенно неважно).
Re[9]: Структура проектов .Net
От: Lloyd Россия  
Дата: 20.07.06 07:19
Оценка:
Здравствуйте, Daimond, Вы писали:

D>Забавно, что образовалось два взаимоисключающих мнения (http://www.rsdn.ru/Forum/Message.aspx?mid=2013197&only=1
Автор: ika
Дата: 19.07.06
)


Присмотрись внимательнее, это одно и то же мнение.

D>Реализовать такое будет возможно, только если дата-слой принимает мета-данные, описывающие КАК сохранить сущности (например, используя NHibernate или подобные мепперы). В противном случае, дата-слой должен знать, что если он принял объект Departament, то должен сохранить поля Name, Code и тд. в соответствующих полях таблицы DEPARTAMENTS, вызвать такие-то хранимки, исполнить такие-то запросы. Кто ему об этом скажет? Либо мета-данные, либо это должно быть в коде DataMappera, а значит слой данных становится зависим от Сущностей бизнес-логики.


Да, совершенно верно.

D>Кинь какой-нть пример тупого как пробка Entity (элементарный, конечно) — меня давно эта тема интересует.


Датасет.
Re[2]: Структура проектов .Net
От: Lloyd Россия  
Дата: 20.07.06 07:20
Оценка:
Здравствуйте, Daimond, Вы писали:

D>А все-таки так никто и не дал ответа на мой основной вопрос.

D>Неужели у все екзешники называются "MyApplication.Forms.exe" ???

Не знаю как у всех, но у нас он называется MyApplication.exe.
Re[3]: Структура проектов .Net
От: Dmitriy Dubrovskiy Россия  
Дата: 20.07.06 07:22
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Daimond, Вы писали:


D>>А все-таки так никто и не дал ответа на мой основной вопрос.

D>>Неужели у все екзешники называются "MyApplication.Forms.exe" ???

A>Нет, просто datalayer не называется MyApplication.dll. Какой это нахрен application, если это datalayer?


Это не DataLayer, а бизнес-логика + слой доступа к данным. Это и есть Application. А морд у приложения может быть много — морды это не Application.
Re[10]: Структура проектов .Net
От: Dmitriy Dubrovskiy Россия  
Дата: 20.07.06 07:35
Оценка:
ika>Какая двусторонняя связь? Какие мапперы? Какие метаданные?
ika>Расставьте между компонентами правильные зависимости! И все! Нефиг городить.

ika>


ika>BO и DAL компоненты кладешь либо в одну сборку либо в разные (совершенно неважно).


Совершенно с тобой согласен. Это тоже вариант. Вполне живучий, но не всегда удобный, тем, что инициатор сохранения в БД является слой Presentation (у тебя AppLayer). Если у тебя сложная бизнес-логика, включающая коллекции, наследование, много всего, и тд., то всю эту структуру должен знать Presentation, чтобы передать все эти объекты DALу для сохранения в БД. Геморойно получается (на сложном примере) и слишком зависимо. Куда проше: пользователь нажал кнопку -> вызывается метод BO.Save() -> бизнес объект сам себя сохраняет со всеми связями и зависимостями. А главное минимальная зависимость между мордами и бизнес-логикой.
Re[3]: Структура проектов .Net
От: Dmitriy Dubrovskiy Россия  
Дата: 20.07.06 07:36
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Daimond, Вы писали:


D>>А все-таки так никто и не дал ответа на мой основной вопрос.

D>>Неужели у все екзешники называются "MyApplication.Forms.exe" ???

L>Не знаю как у всех, но у нас он называется MyApplication.exe.


А как называется сборка с бизнес-логикой?
Re[10]: Структура проектов .Net
От: Dmitriy Dubrovskiy Россия  
Дата: 20.07.06 07:47
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Daimond, Вы писали:


D>>Забавно, что образовалось два взаимоисключающих мнения (http://www.rsdn.ru/Forum/Message.aspx?mid=2013197&only=1
Автор: ika
Дата: 19.07.06
)


L>Присмотрись внимательнее, это одно и то же мнение.


"правильно — это чтобы DataLayer знал (зависел от) о Domain" !=
"бизнес-логика ... обращается к da-слою для загрузки/сохранения сущностей."

L>Датасет.


ДатаСет? В датасете можно воспроизвести структуру БД, и команды для модификации таблиц, но в большинстве случаев структура бизнес-логики отличается от структуры БД. Так что появляется слой (типа, DataLayer)Ю который эти структуры в соответствие приводит. И он в курсе как о БД, так и о Бизнес-логики. Так что один только Датасет, по моему мнению, всех проблем не решит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.