powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / О применении SOLID
159 сообщений из 159, показаны все 7 страниц
О применении SOLID
    #38511720
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мотивам закрытого топика.
skyANAКак Вы предлагете использовать сборку MessageServer.dll? Тупо референс на неё добавить? И что это даст?Вы правильно заметили, что:skyANAАлексей К Тут выделена часть кода для повторного использования.Посмотрел на класс. Это действительно "часть кода для повторного использования", то есть в нём просто собранны методы, что используются в проекте более одного раза. Этакий глобальный хелпер для проекта.Речь шла о повторном использовании фрагментов логики именно внутри данного проекта (solution в терминологии VS). Повторное использование этой логики вне данного проекта не требуется. А для повторного использования внутри проекта - да, достаточно "тупо референс на неё добавить".

Я не планирую использовать прикладной модуль MessageServer.dll где-то ещё кроме этого проекта. Проект разделён на прикладные модули для удобства его сопровождения. Для повторного использования в нескольких проектах (их у меня сейчас 6) предназначены 3 системных модуля SspMainXXX.dll.

Здесь нет необходимости выделения прикладной логики в отдельный слой репозитариев для её отделения от слоя WCF-ных сервисов. Здесь нет необходимости в описании всего и вся интерфейсами с последующей интеграцией этого безобразия DI-контейнером. Пусть классы зависят от классов "нижних" слоёв, ничего плохого в этом не вижу.

Мне непонятно почему проекты без использования IoC/DI автоматически считаются плохими по мнению некоторых. Мне кажется это не так.

skyANAЭто же WCF сервис. То есть другой проект - это нечто иное

Зачем писать второй WCF сервис для работы с сообщениями (message), если SvcMessage уже написан? Незачем.
Зачем цеплять сборку WCF сервиса туда, где он не нужен? Тоже незачем.К SvcMessage может осуществляться доступ как удалённо через WCF, так и локально на сервере, обычным созданием этого класса оператором new или DI-контейнером, на любителя. Это обычный класс, имеющий атрибуты для работы с ним через WCF.

skyANAПосмотрев остальной код проекта, прихожу к выводу, что DRY (don’t repeat yourself) у Вас и не пахнет.Перед тем как делать какие-то выводы обычно слушается мнение всех заинтересованных сторон. Укажите на места с "варварским копипастом" в этом проекте. Уверен, всему найдётся разумное объяснение.
...
Рейтинг: 0 / 0
О применении SOLID
    #38511738
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПо мотивам закрытого топика.
skyANAКак Вы предлагете использовать сборку MessageServer.dll? Тупо референс на неё добавить? И что это даст?Вы правильно заметили, что:skyANAпропущено...
Посмотрел на класс. Это действительно "часть кода для повторного использования", то есть в нём просто собранны методы, что используются в проекте более одного раза. Этакий глобальный хелпер для проекта.Речь шла о повторном использовании фрагментов логики именно внутри данного проекта (solution в терминологии VS). Повторное использование этой логики вне данного проекта не требуется. А для повторного использования внутри проекта - да, достаточно "тупо референс на неё добавить".

Я не планирую использовать прикладной модуль MessageServer.dll где-то ещё кроме этого проекта.
Значит я был прав и Вы поспешили задать свой вопрос "Как так?":Алексей КskyANA Посмотрел на класс. Это действительно "часть кода для повторного использования" , то есть в нём просто собранны методы, что используются в проекте более одного раза. Этакий глобальный хелпер для проекта.

Копипаст, кстати, тоже можно назвать повторным использованием кода, а самый распространённый случай повторного использования кода — библиотеки, что позволяют использовать одни и теже компоненты в разных проектах.
Последнее - это не Ваш случай. Как так?
Алексей КЗдесь нет необходимости выделения прикладной логики в отдельный слой репозитариев для её отделения от слоя WCF-ных сервисов. Здесь нет необходимости в описании всего и вся интерфейсами с последующей интеграцией этого безобразия DI-контейнером.Почему если интерфейсы, то сразу DI?

К примеру у Вас там есть автосгенерированный тип message, состояние экземпляра данного типа вызывающий код может изменить как угодно, т.к. все его свойства имеют публичные сеттеры.

А если так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
namespace Model.Interfaces
{
    public interface IMessage
    {
        ISender Sender { get; }
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
namespace Model
{
    public class Message : IMessage
    {
        public ISender Sender { get; internal set; }
    }
}

То получаем инкапсуляцию на уровне модели.

Алексей КskyANAЭто же WCF сервис. То есть другой проект - это нечто иное

Зачем писать второй WCF сервис для работы с сообщениями (message), если SvcMessage уже написан? Незачем.
Зачем цеплять сборку WCF сервиса туда, где он не нужен? Тоже незачем.К SvcMessage может осуществляться доступ как удалённо через WCF, так и локально на сервере, обычным созданием этого класса оператором new ...Вы реально так делаете? Хотя чего это я спрашиваю. Выше Вы писали, что не планируете использовать прикладной модуль MessageServer.dll где-то ещё.

Алексей КskyANAПосмотрев остальной код проекта, прихожу к выводу, что DRY (don’t repeat yourself) у Вас и не пахнет.Перед тем как делать какие-то выводы обычно слушается мнение всех заинтересованных сторон.Хорошо. Вы можете своими словами описать, какие компоненты внутри проекта выделены по принципу DRY и почему этого достаточно на Ваш взгляд?
...
Рейтинг: 0 / 0
О применении SOLID
    #38511757
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПочему если интерфейсы, то сразу DI?Не всегда, но часто. :-)
skyANAК примеру у Вас там есть автосгенерированный тип message, состояние экземпляра данного типа вызывающий код может изменить как угодно, т.к. все его свойства имеют публичные сеттеры.

А если так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
namespace Model.Interfaces
{
    public interface IMessage
    {
        ISender Sender { get; }
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
namespace Model
{
    public class Message : IMessage
    {
        public ISender Sender { get; internal set; }
    }
}

То получаем инкапсуляцию на уровне модели.Эта "красота" вызовет в дальнейшем необходимость описания специального DTO, что нарушает моё представление о DRY, но об этом ниже. Одним словом - оно того не стоит.

skyANAАлексей Кпропущено...
К SvcMessage может осуществляться доступ как удалённо через WCF, так и локально на сервере, обычным созданием этого класса оператором new ...Вы реально так делаете?Внутри проекта - да, такие случаи были, но редко. Негативных эффектов от такого использования замечено не было.

skyANAАлексей Кпропущено...
Перед тем как делать какие-то выводы обычно слушается мнение всех заинтересованных сторон.Хорошо. Вы можете своими словами описать, какие компоненты внутри проекта выделены по принципу DRY и почему этого достаточно на Ваш взгляд?Думаю, все. Основная цель - не писать несколько раз одно и то же.

Везде где можно применяется кодогенерация. Бизнес-объекты слоя данных и логики применяются в том числе в качестве DTO, чтобы не описывать одинаковые структуры данных в нескольких местах.
...
Рейтинг: 0 / 0
О применении SOLID
    #38511766
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВы можете своими словами описать, какие компоненты внутри проекта выделены по принципу DRY и почему этого достаточно на Ваш взгляд?Или Вы хотели увидеть все компоненты, выделенные отдельно для повторного использования? Я немного не понял вопрос.
...
Рейтинг: 0 / 0
О применении SOLID
    #38511775
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВезде где можно применяется кодогенерация. Бизнес-объекты слоя данных и логики применяются в том числе в качестве DTO, чтобы не описывать одинаковые структуры данных в нескольких местах. а можно пример? Возьму на заметочку
...
Рейтинг: 0 / 0
О применении SOLID
    #38511792
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanАлексей КВезде где можно применяется кодогенерация. Бизнес-объекты слоя данных и логики применяются в том числе в качестве DTO, чтобы не описывать одинаковые структуры данных в нескольких местах. а можно пример? Возьму на заметочку
Бизнес-объекты сгенерированного по БД слоя данных помечены WCF-ными атрибутами и передаются на клиента, например тут (метод GetPersonalEditByID) . Там же содержатся рукописные бизнес-объекты слоя логики (например класс PersonalView), которые так же имеют WCF-ные атрибуты и отдаются клиенту.

На клиенте эти классы имеют "двойников", сгенерированных по WSDL .
...
Рейтинг: 0 / 0
О применении SOLID
    #38511810
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВезде где можно применяется кодогенерация

Чем генерите? T4 или каким-либо платным продуктом типа CodeSmith?
...
Рейтинг: 0 / 0
О применении SOLID
    #38511813
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей КВезде где можно применяется кодогенерация
Чем генерите? T4 или каким-либо платным продуктом типа CodeSmith?Запускаю из T4 Text Template. Но некоторые части кодогенератора описаны в виде сборок (assembly), скомпилированных отдельно.

1. Подробности по генерации контекста базы данных Entity Framework.

2. Подробности по генерации WCF-клиентов.
...
Рейтинг: 0 / 0
О применении SOLID
    #38511821
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
авторАвтоматическое закрытие соединения из финализатора, на случай, если в прикладном коде не производится явное закрытие соединения в следствие ошибки. ???
...
Рейтинг: 0 / 0
О применении SOLID
    #38511831
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К,
авторАвтоматическое закрытие соединения из финализатора, на случай, если в прикладном коде не производится явное закрытие соединения в следствие ошибки. ???Например, SqlConnection из финализатора закрывает соединение, если до этого ему не вызвали Close или Dispose. В WCF Channel такого почему-то нет. Если явно не закрыть соединение - оно остаётся "навсегда". Поэтому добавил закрытие из финализатора навсякий. Можно ещё добавить вывод сообщения в лог.
...
Рейтинг: 0 / 0
О применении SOLID
    #38511845
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
это косноязычно, и наводит на мысль что финализатор вызовется в период жизни приложения в обязательном порядке
а не только при его закрытии..
...
Рейтинг: 0 / 0
О применении SOLID
    #38511861
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К,
это косноязычно, и наводит на мысль что финализатор вызовется в период жизни приложения в обязательном порядке
а не только при его закрытии..Ну все же знают когда вызывается финализатор. Мне кажется тут уточнение не требуется. Впрочем, я поправил формулировку. Согласен что было "так себе". Вроде стало лучше:
автор* Автоматическое закрытие соединения из финализатора на случай, если закрытие соединения не производится явно из-за ошибки в прикладном коде.

зы: Недавно поймал себя на мысли, что я совершенно разучился писать по-русски. Постепенно навёрстываю упущенное. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38511874
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
авторНу все же знают когда вызывается финализатор ну уж вы погорячились, половина не знает
или думает что только при удалении объекта коллектором, без внимания реализует ли тип IDisposable,
и он в общем то может и никогда не вызваться окромя закрытия программы.
У меня вопрос, а что вы носитеь с этим закрытием соединения, в чем тут сокральная изюминка, или вы используете ресурсы ядра
для этого даже внедрили IDisposable, не могу уловить мысль???
...
Рейтинг: 0 / 0
О применении SOLID
    #38511902
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К,
авторНу все же знают когда вызывается финализатор ну уж вы погорячились, половина не знает
или думает что только при удалении объекта коллектором, без внимания реализует ли тип IDisposable,
и он в общем то может и никогда не вызваться окромя закрытия программы.Текст ориентирован на подготовленного читателя. :-)

Где-то в степиУ меня вопрос, а что вы носитеь с этим закрытием соединения, в чем тут сокральная изюминка, или вы используете ресурсы ядра для этого даже внедрили IDisposable, не могу уловить мысль???
У меня много случаев, когда нужно дёрнуть только один метод вебсервиса. Без дополнительных костылей правильный вызов выглядит как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
var channel = SomeFactory.CreateChannel<SomeChannel>();
try
{
    channel.SomeMethod();
}
finally
{
    try
    {
        var co = (ICommunicationObject)channel;
        if (co.State == CommunicationState.Opened)
            co.Close();
        else
            co.Abort();
    }
    catch (Exception e)
    {
        // Ошибки закрытия, наверное, не должны влиять на логику выполнения
        // прикладного кода. Но сообщать о них надо.
        Log.AddException(e);
    }
}


С костылями так:
Код: c#
1.
2.
// Там по дефолту IsAutoClose == true
SomeFactory.CreateClient<SomeClient>().SomeMethod();
...
Рейтинг: 0 / 0
О применении SOLID
    #38511918
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и незакрытые соединения плохо влияют на WCF-сервер, поэтому добавил закрытие из финализатора. Благо, в WPF-приложении сборка мусора производится достаточно часто. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38511927
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степидля этого даже внедрили IDisposable
IDisposable позволяет делать так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using(var c = SomeFactory.CreateClient<SomeClient>())
{
    // Чтобы вызвать группу методов, не закрывая соединение.
    // Так быстрее.
    c.IsAutoClose = false;

    c.SomeMethod1();
    c.SomeMethod2();
}


В чистом виде WCF-ный канал (и клиент) нельзя использовать с using. Там метод Dispose может генерить исключение со всеми вытекающими.
...
Рейтинг: 0 / 0
О применении SOLID
    #38511997
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
авторплохо влияют на WCF-сервер
это как? ведь в вашем случае соединение устанавливается через службу Net.TCP, ( одну на все приложения)
вы кода абортируетесь или закрываете там просто исчезает ссылка на ваш поток и урл в таблице маршрутизации , внешний сокет, как был на прослушке - так и останется ( на вашем компе) а сервер хоста вообще может уйти в спячку, если его не пинать просьбами...
...
Рейтинг: 0 / 0
О применении SOLID
    #38512005
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор внешний сокет, как был на прослушке тут я погорячился, ну воспримем это в общих чертах
...
Рейтинг: 0 / 0
О применении SOLID
    #38512018
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К,
авторплохо влияют на WCF-сервер
это как? ведь в вашем случае соединение устанавливается через службу Net.TCP, ( одну на все приложения)
вы кода абортируетесь или закрываете там просто исчезает ссылка на ваш поток и урл в таблице маршрутизации , внешний сокет, как был на прослушке - так и останется ( на вашем компе) а сервер хоста вообще может уйти в спячку, если его не пинать просьбами...В том-то и дело, что из-за ошибки в прикладном коде клиента сетевой пакет с командой закрытия соединения на сервер может не прийти и сервер будет считать, что соединение открыто. Ну забыли на клиенте вызвать Close или Dispose, с кем не бывает. :-)

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

Тем более, у нас с этим были проблемы на начальном этапе разработки. При их решении в том числе был добавлен и финализатор.

В общем, с финализатором как-то спокойнее. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38512183
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кnetivanпропущено...
а можно пример? Возьму на заметочку
Бизнес-объекты сгенерированного по БД слоя данных помечены WCF-ными атрибутами и передаются на клиента, например тут (метод GetPersonalEditByID) . Там же содержатся рукописные бизнес-объекты слоя логики (например класс PersonalView), которые так же имеют WCF-ные атрибуты и отдаются клиенту.

На клиенте эти классы имеют "двойников", сгенерированных по WSDL .
вот это DTO и называется?
Смотрите:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    IQueryable<PersonalView> GetPersonalViewByFilterInternal(string name, bool isShowRetired)
        {
            var parsedName = SvcPersonalCore.ParseName(name);
 
            if (parsedName == null)
                return null;
 
            using (DbMainFactory.Scope)
            {
                var q = PersonalView;
 
          .....
                return q;
            }
        }


PersonalView это же и есть ваш бизнес-объект, а в контексте БД (DbMainFactory.Scope) другой объект. Имеется разделение. А вы говорите, нет дублирования. Я как-то не так понял мысль?
И поделитесь вашей proxy wcf с финализатором :)
...
Рейтинг: 0 / 0
О применении SOLID
    #38512214
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К2. Подробности по генерации WCF-клиентов.
Вопрос немного не по теме (генерации), но мне показался достаточно важным
Фабрика сетевых службКлиенты сетевых служб создаются с помощью фабрики, расположенной в классе WsFactory.
...
Метод GetChannel содержит создание канала (Channel), используемого для взаимодействия с сервером...
Каждый раз для создания канала создается фабрика, но создание фабрики вроде как дорогостоящая операция (по сравнению с созданием канала)... почему бы не закэшировать фабрику?

P.S. Алексей, спасибо за Ваши труды на благо сообщества!
...
Рейтинг: 0 / 0
О применении SOLID
    #38512239
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanPersonalView это же и есть ваш бизнес-объект, а в контексте БД (DbMainFactory.Scope) другой объект. Имеется разделение. А вы говорите, нет дублирования. Я как-то не так понял мысль? PersonalView - это класс, описывающий структуру данных элемента списка формы "Персонал".

personal - класс, описывающий таблицу в базе данных.

Это разные сущности в системе. Да, какие-то поля в них дублируются, но эти классы скорее разные чем одинаковые. Более того, я не уверен, что при добавлении полей в таблицу в базе данных я захочу увидеть автоматическое добавление полей в элемент списка формы. Поэтому было решено сделать класс PersonalView "с нуля", чем использовать при его описании класс personal.

Конечно, можно сделать и так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class PersonalView
{
    public personal Base;

    public string FullName;

    // и прочие вычисляемые поля.
}


В каких-то случаях именно так и делается, но не в этом.

netivanИ поделитесь вашей proxy wcf с финализатором :) Исходник

Описание
...
Рейтинг: 0 / 0
О применении SOLID
    #38512250
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRАлексей К2. Подробности по генерации WCF-клиентов.
Вопрос немного не по теме (генерации), но мне показался достаточно важным
Фабрика сетевых службКлиенты сетевых служб создаются с помощью фабрики, расположенной в классе WsFactory.
...
Метод GetChannel содержит создание канала (Channel), используемого для взаимодействия с сервером...
Каждый раз для создания канала создается фабрика, но создание фабрики вроде как дорогостоящая операция (по сравнению с созданием канала)... почему бы не закэшировать фабрику?В следующих версиях WCF они обещали оптимизировать создание ChannelFactory<>, где-то была статья об этом. Вероятно в 4.5 это уже оптимизировано. Проверить это у меня сейчас нет возможности.

При повторном использовании одного объекта фабрики для создания нескольких Channel-ов возникали проблемы. Какие - я сейчас точно не вспомню, надо опять делать тест и читать MSDN. Но точно помню, что проблемы были, что-то там не работало. :-)

LRP.S. Алексей, спасибо за Ваши труды на благо сообщества!Пасиб. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38512302
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КnetivanPersonalView это же и есть ваш бизнес-объект, а в контексте БД (DbMainFactory.Scope) другой объект. Имеется разделение. А вы говорите, нет дублирования. Я как-то не так понял мысль? PersonalView - это класс, описывающий структуру данных элемента списка формы "Персонал".

personal - класс, описывающий таблицу в базе данных.

Это разные сущности в системе. Да, какие-то поля в них дублируются, но эти классы скорее разные чем одинаковые. Более того, я не уверен, что при добавлении полей в таблицу в базе данных я захочу увидеть автоматическое добавление полей в элемент списка формы. Поэтому было решено сделать класс PersonalView "с нуля", чем использовать при его описании класс personal.

Конечно, можно сделать и так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class PersonalView
{
    public personal Base;

    public string FullName;

    // и прочие вычисляемые поля.
}


В каких-то случаях именно так и делается, но не в этом.

netivanИ поделитесь вашей proxy wcf с финализатором :) Исходник

Описание
1. с PersonalView все ясно, я мысль не так понял
2. с каналом интересно.Только IDisposable как-то не по паттерну с МСДН, непрвычно видеть без флага) надо все исходники посмотреть. Асинхронное выполнение заинтересовало.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512750
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRКаждый раз для создания канала создается фабрика, но создание фабрики вроде как дорогостоящая операция (по сравнению с созданием канала)... почему бы не закэшировать фабрику?
Если закешировать, оно в принципе работает. Но тогда нет возможности изменить параметры соединения у фабрики. Она этого не позволяет после создания хотя бы одного канала с помощью неё.

Чисто визуально разницы в работе приложения с кэшированием я не заметил. Из-за дополнительных ограничений для себя решил кэширование не делать.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    public static class WsFactory
    {
        public static WsConnectionInfo ConnectionInfo { get; set; }

        static readonly ConcurrentDictionary<Type, ChannelFactory> TypeToFactory =
            new ConcurrentDictionary<Type, ChannelFactory>();

        static T GetChannel<T>()
        {
            if (ConnectionInfo == null)
                throw new ArgumentNullException("ConnectionInfo");

            var factory = (ChannelFactory<T>)TypeToFactory.GetOrAdd(
                typeof(T),
                t =>
                {
                    var serviceName = WsClientHelper.GetServiceName(typeof(T));
                    var address = string.Format("net.tcp://{0}/{1}", ConnectionInfo.BaseAddress, serviceName);
                    var endpointIdentity = EndpointIdentity.CreateDnsIdentity("SimpleSolutionProject-Public");
                    var endpointAddress = new EndpointAddress(new Uri(address), endpointIdentity);

                    var r = new ChannelFactory<T>(WsConfiguration.GetNetTcpBinding(), endpointAddress);
                    r.Endpoint.Behaviors.Add(new DataContractSerializerEndpointBehavior());
                    r.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
                    r.Credentials.UserName.UserName = ConnectionInfo.UserName;
                    r.Credentials.UserName.Password = ConnectionInfo.Password;
                    return r;
                }
            );

            return factory.CreateChannel();
        }
    }

...
Рейтинг: 0 / 0
О применении SOLID
    #38512793
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КLRпропущено...

Вопрос немного не по теме (генерации), но мне показался достаточно важным
пропущено...

Каждый раз для создания канала создается фабрика, но создание фабрики вроде как дорогостоящая операция (по сравнению с созданием канала)... почему бы не закэшировать фабрику?В следующих версиях WCF они обещали оптимизировать создание ChannelFactory<>, где-то была статья об этом. Вероятно в 4.5 это уже оптимизировано. Проверить это у меня сейчас нет возможности.

При повторном использовании одного объекта фабрики для создания нескольких Channel-ов возникали проблемы. Какие - я сейчас точно не вспомню, надо опять делать тест и читать MSDN. Но точно помню, что проблемы были, что-то там не работало. :-)

LRP.S. Алексей, спасибо за Ваши труды на благо сообщества!Пасиб. :-)

А зачем создавать несколько ChannelFactory, если это обобщенный класс? ChannelFactory - это пул соединений, какие причины плодить их на клиенте?
Не хочется статиков? Так для этого есть DI, который ты не осилил и без которого не бывает вменяемых фреймворков.
В net 4.5 его действительно оптимизировали и соединения кэшируются даже если меняется учетка. Помимо этого в wcf появилаcь нативная поддержка тасков и твои танцы с бубнами(FromAsync) совсем не нужны, а мультики в сервисах с ThreadStatic - просто вредны. EF теперь тоже асинхронный и сервисы можно и нужно делать с тасками. Это гораздо больше будет влиять на wcf сервисы, чем твои мультики с прокси на клиенте. Генерить последние - полный маразм для внутренних сервисов и тд.

ЗЫ SOLID придумали не на пустом месте - это набор принципов, которые нужно соблюдать, чтобы можно было без геморроя развивать систему и вносить в нее изменения, если этого нет, то это кривая архитектура.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512795
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КLRКаждый раз для создания канала создается фабрика, но создание фабрики вроде как дорогостоящая операция (по сравнению с созданием канала)... почему бы не закэшировать фабрику?
Если закешировать, оно в принципе работает. Но тогда нет возможности изменить параметры соединения у фабрики. Она этого не позволяет после создания хотя бы одного канала с помощью неё.

Чисто визуально разницы в работе приложения с кэшированием я не заметил. Из-за дополнительных ограничений для себя решил кэширование не делать.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    public static class WsFactory
    {
        public static WsConnectionInfo ConnectionInfo { get; set; }

        static readonly ConcurrentDictionary<Type, ChannelFactory> TypeToFactory =
            new ConcurrentDictionary<Type, ChannelFactory>();

        static T GetChannel<T>()
        {
            if (ConnectionInfo == null)
                throw new ArgumentNullException("ConnectionInfo");

            var factory = (ChannelFactory<T>)TypeToFactory.GetOrAdd(
                typeof(T),
                t =>
                {
                    var serviceName = WsClientHelper.GetServiceName(typeof(T));
                    var address = string.Format("net.tcp://{0}/{1}", ConnectionInfo.BaseAddress, serviceName);
                    var endpointIdentity = EndpointIdentity.CreateDnsIdentity("SimpleSolutionProject-Public");
                    var endpointAddress = new EndpointAddress(new Uri(address), endpointIdentity);

                    var r = new ChannelFactory<T>(WsConfiguration.GetNetTcpBinding(), endpointAddress);
                    r.Endpoint.Behaviors.Add(new DataContractSerializerEndpointBehavior());
                    r.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
                    r.Credentials.UserName.UserName = ConnectionInfo.UserName;
                    r.Credentials.UserName.Password = ConnectionInfo.Password;
                    return r;
                }
            );

            return factory.CreateChannel();
        }
    }




Это бред. Дорогостоящая операция - создание соединения, их как раз и кэширует фабрика.
Матчасть нужно знать
...
Рейтинг: 0 / 0
О применении SOLID
    #38512804
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaА зачем создавать несколько ChannelFactory, если это обобщенный класс?Этого не понял.
SeVaChannelFactory - это пул соединений, какие причины плодить их на клиенте?Мне казалось NetTCP пул соединений живёт вне объекта ChannelFactory, так же как пул соединений к БД живёт вне объекта SqlConnection.
SeVaВ net 4.5 его действительно оптимизировали и соединения кэшируются даже если меняется учетка. Помимо этого в wcf появилаcь нативная поддержка тасков и твои танцы с бубнами(FromAsync) совсем не нужныНу мне-то от этого не легче. Мне нужна поддержка WinXP.
SeVaа мультики в сервисах с ThreadStatic - просто вредны. EF теперь тоже асинхронный и сервисы можно и нужно делать с тасками.А мне с ThreadStatic нравится. И от асинхронностей на сервере для своих проектов я пользы не вижу. Только неоправданное усложнение.
SeVaЭто гораздо больше будет влиять на wcf сервисы, чем твои мультики с прокси на клиенте. Генерить последние - полный маразм для внутренних сервисов и тд.Я не хочу использовать серверные классы на клиенте. Мне больше нравится их генерировать через WSDL. И на то есть причины.
SeVaЗЫ SOLID придумали не на пустом месте - это набор принципов, которые нужно соблюдать, чтобы можно было без геморроя развивать систему и вносить в нее изменения, если этого нет, то это кривая архитектура.Ну используй, я не возражаю.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512805
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaАлексей Кпропущено...

Если закешировать, оно в принципе работает. Но тогда нет возможности изменить параметры соединения у фабрики. Она этого не позволяет после создания хотя бы одного канала с помощью неё.

Чисто визуально разницы в работе приложения с кэшированием я не заметил. Из-за дополнительных ограничений для себя решил кэширование не делать.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    public static class WsFactory
    {
        public static WsConnectionInfo ConnectionInfo { get; set; }

        static readonly ConcurrentDictionary<Type, ChannelFactory> TypeToFactory =
            new ConcurrentDictionary<Type, ChannelFactory>();

        static T GetChannel<T>()
        {
            if (ConnectionInfo == null)
                throw new ArgumentNullException("ConnectionInfo");

            var factory = (ChannelFactory<T>)TypeToFactory.GetOrAdd(
                typeof(T),
                t =>
                {
                    var serviceName = WsClientHelper.GetServiceName(typeof(T));
                    var address = string.Format("net.tcp://{0}/{1}", ConnectionInfo.BaseAddress, serviceName);
                    var endpointIdentity = EndpointIdentity.CreateDnsIdentity("SimpleSolutionProject-Public");
                    var endpointAddress = new EndpointAddress(new Uri(address), endpointIdentity);

                    var r = new ChannelFactory<T>(WsConfiguration.GetNetTcpBinding(), endpointAddress);
                    r.Endpoint.Behaviors.Add(new DataContractSerializerEndpointBehavior());
                    r.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
                    r.Credentials.UserName.UserName = ConnectionInfo.UserName;
                    r.Credentials.UserName.Password = ConnectionInfo.Password;
                    return r;
                }
            );

            return factory.CreateChannel();
        }
    }




Это бред. Дорогостоящая операция - создание соединения, их как раз и кэширует фабрика.
Матчасть нужно знатьНу, а там что закешировано? Жжошь?
...
Рейтинг: 0 / 0
О применении SOLID
    #38512808
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaпропущено...


Это бред. Дорогостоящая операция - создание соединения, их как раз и кэширует фабрика.
Матчасть нужно знатьНу, а там что закешировано? Жжошь?

Учи матчасть, что из себя представляет канальная фабрика подробно разжевано в msdn. WCF основан на каналах , а это целое кино. Без понимания, которого появляются маразмы и отжиги со статиками для channelfactory
...
Рейтинг: 0 / 0
О применении SOLID
    #38512818
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaУчи матчасть, что из себя представляет канальная фабрика подробно разжевано в msdn. WCF основан на каналах , а это целое кино. Без понимания, которого появляются маразмы и отжиги со статиками для channelfactoryФраза "connection pool" в тексте этой статьи не найдена. Зачем ты дал на неё ссылку?
...
Рейтинг: 0 / 0
О применении SOLID
    #38512820
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА мне с ThreadStatic нравится. И от асинхронностей на сервере для своих проектов я пользы не вижу. Только неоправданное усложнение.
SeVaЭто гораздо больше будет влиять на wcf сервисы, чем твои мультики с прокси на клиенте. Генерить последние - полный маразм для внутренних сервисов и тд.Я не хочу использовать серверные классы на клиенте. Мне больше нравится их генерировать через WSDL. И на то есть причины.


1. Причины сразу видны, если провести хотя бы раз нагрузочное тестирование.
ThreadStatic на данный момент, когда есть await - натуральное убожество и костыль, которые все усложняет в разы с малопонятным поведением и устойчивостью
2. Никаких причин нет, тк генерим только мусор и повторно создаем классы и интерфейсы.
Подозреваю, что все это из-за извратов с наследованием и прочих мультиков, так это тоже маразм.
Гораздо проще создать view в бд и на автомате использовать EF, а не вышивать крестиком вручную собирая классы.
Никакого наследования в DTO(бизнес-классами у тебя даже не пахнет) быть не должно, рано или поздно функционал разбежится по разным углам.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512822
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaУчи матчасть, что из себя представляет канальная фабрика подробно разжевано в msdn. WCF основан на каналах , а это целое кино. Без понимания, которого появляются маразмы и отжиги со статиками для channelfactoryФраза "connection pool" в тексте этой статьи не найдена. Зачем ты дал на неё ссылку?

Чтобы ты хотя слегка имел представление о wcf. Эта статья для чайников
...
Рейтинг: 0 / 0
О применении SOLID
    #38512825
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaУдачи!
...
Рейтинг: 0 / 0
О применении SOLID
    #38512826
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
О применении SOLID
    #38512829
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa тынц автор.NET Framework 4.5
...
Рейтинг: 0 / 0
О применении SOLID
    #38512893
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaChannelFactory - это пул соединений, какие причины плодить их на клиенте?Мне казалось NetTCP пул соединений живёт вне объекта ChannelFactory, так же как пул соединений к БД живёт вне объекта SqlConnection.Так и есть. Netstat.exe показывает, что WCF-ный NetTCP пул соединений на клиенте работает нормально.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512904
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,


Алексей КSeVa тынц автор.NET Framework 4.5

Фабрика каналов была и есть в net 3.5.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512914
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaАлексей К,


Алексей Кпропущено...
пропущено...


Фабрика каналов была и есть в net 3.5.Ну и что? Там оптимизации про которые ты пишешь добавлены, и про которые я тоже писал , добавлены в 4.5.
...
Рейтинг: 0 / 0
О применении SOLID
    #38512916
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавлены
...
Рейтинг: 0 / 0
О применении SOLID
    #38512937
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaАлексей К,


пропущено...


Фабрика каналов была и есть в net 3.5.Ну и что? Там оптимизации про которые ты пишешь добавлены, и про которые я тоже писал , добавлены в 4.5.

ChannelFactory был еще со времен net 3.5. В wpf&wcf большие возможности, посему они за раз не осваиваются, правильные подходы тем более. Посему лучше не изобретать свои велосипеды(в особенности, когда скачешь только по верхам и глубоко не копаешь), а брать готовое.
Все давно придумано до нас. Например, Exception Handling WCF Proxy Generator . Есть интеграция с vs и восстановление при сбоях.
...
Рейтинг: 0 / 0
О применении SOLID
    #38513052
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

круто давать ссылки на проекты,не обновляющиеся 3 года и имеющие статус бета.
...
Рейтинг: 0 / 0
О применении SOLID
    #38513084
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говнокостыли нужны вам, вы привыкли только кнопочки в студии нажимать без всякого понимания.
В одном резюме попалась фраза : "с# на уровне пользователя". Сапотски тоже про себя мог бы это написать
...
Рейтинг: 0 / 0
О применении SOLID
    #38513091
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaВ одном резюме попалась фраза : "с# на уровне пользователя". Сапотски тоже про себя мог бы это написать
Ну мог бы чо...
...
Рейтинг: 0 / 0
О применении SOLID
    #38513141
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЕсли закешировать, оно в принципе работает. Но тогда нет возможности изменить параметры соединения у фабрики. Она этого не позволяет после создания хотя бы одного канала с помощью неё.

Чисто визуально разницы в работе приложения с кэшированием я не заметил. Из-за дополнительных ограничений для себя решил кэширование не делать.
Алексей, спасибо за разъяснения. Получается, без кэширования оно и надежней (мало ли что случится с фабрикой) и гибче (например, пользователь "на лету" сможет перелогиниться и т.п.)... а проблема производительности - это особый случай/задача (не Ваш случай).
...
Рейтинг: 0 / 0
О применении SOLID
    #38513154
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребятки, подхалтурить не желаете?
...
Рейтинг: 0 / 0
О применении SOLID
    #38513241
hr_hr_hr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 часа и ни одного резюме. Ну и куда прикажете деньги девать...?
...
Рейтинг: 0 / 0
О применении SOLID
    #38513270
Фотография James Bond FR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hr_hr_hr2 часа и ни одного резюме. Ну и куда прикажете деньги девать...?
Вложите туда где нет слова - азуре. На сегодня это глючная херь с которой никто не хочет связываться.
...
Рейтинг: 0 / 0
О применении SOLID
    #38513288
hr_hr_hr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
James Bond FR,

да мне не принципиально где хостить. Да и азур хлопот не доставлял(кроме аптайма блобов)
...
Рейтинг: 0 / 0
О применении SOLID
    #38513880
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЭта "красота" вызовет в дальнейшем необходимость описания специального DTO, что нарушает моё представление о DRY, но об этом ниже. Одним словом - оно того не стоит.Алексей КБизнес-объекты слоя данных и логики применяются в том числе в качестве DTO, чтобы не описывать одинаковые структуры данных в нескольких местах.Всё это замечательно работает пока один формат хранения данных, один формат их передачи, один способ получения.

Но что будет, если при развитии проекта, что-то добавится, или изменится? Насколько Ваше решение гибкое и масштабируемое?
...
Рейтинг: 0 / 0
О применении SOLID
    #38513983
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

а что помешает навернуть новую логику на его "контрактный" класс?
...
Рейтинг: 0 / 0
О применении SOLID
    #38514198
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, помешает то, что нельзя быстро и незаметно добавить или изменить формат хранения данных, формат их передачи, способ получения.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514302
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivan, помешает то, что нельзя быстро и незаметно добавить или изменить формат хранения данных, формат их передачи, способ получения. давайте на примере. А то это все аюстрактоно. Сейчас имеем: репозиторий, который возвращает бизнес-объекты. имеется возможность быстро это передать по WCF, например.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514438
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAnetivan, помешает то, что нельзя быстро и незаметно добавить или изменить формат хранения данных, формат их передачи, способ получения.Сейчас имеем: репозиторий, который возвращает бизнес-объекты. имеется возможность быстро это передать по WCF, например.Сейчас нет репозитория и бизнес-объектов.
Последние по идее инкапсулируют в себе необходимую логику предметной области, а мы видим вместо инкапсуляции набор хелп-методов.
netivanдавайте на примере. А то это все аюстрактоно.Хм. Как вы понимаете сл. фразу: "быстро и незаметно добавить или изменить формат хранения данных, формат их передачи, способ получения"?
...
Рейтинг: 0 / 0
О применении SOLID
    #38514461
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivanпропущено...
Сейчас имеем: репозиторий, который возвращает бизнес-объекты. имеется возможность быстро это передать по WCF, например.Сейчас нет репозитория и бизнес-объектов.
Последние по идее инкапсулируют в себе необходимую логику предметной области, а мы видим вместо инкапсуляции набор хелп-методов.
netivanдавайте на примере. А то это все аюстрактоно.Хм. Как вы понимаете сл. фразу: "быстро и незаметно добавить или изменить формат хранения данных, формат их передачи, способ получения"?
наверное мы о разных вещах. Я там увидел репозиторий - набор методов, осуществляющие манипуляции с бизнес объектами. Чем вам не репозиторий?
...
Рейтинг: 0 / 0
О применении SOLID
    #38514469
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, какой конкретно класс по Вашему реализует шаблон репозиторий?
...
Рейтинг: 0 / 0
О применении SOLID
    #38514486
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

например вот класс
чем не репозиторий? Тем, что он не наследует IRepository<T>?
...
Рейтинг: 0 / 0
О применении SOLID
    #38514583
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, обратимся к определению: Repository .

П. 1A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection.
П. 2Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers.
С натяжкой можно сказать, что первый пункт выполняется, если предположить, что DTO объекты типа PersonalView и есть доменные объекты.
Но вот второй пункт не выполняется. Смотрите методы GetPersonalEditNew, GetPersonalEditByID и SavePersonal.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514585
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и если говорить о SOLID, то явное нарушение принципа Single responsibility: класс и репозиторий, и маппер, и сервис.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514598
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivan, обратимся к определению: Repository .

П. 1A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection.
П. 2Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers.
С натяжкой можно сказать, что первый пункт выполняется, если предположить, что DTO объекты типа PersonalView и есть доменные объекты.
Но вот второй пункт не выполняется. Смотрите методы GetPersonalEditNew, GetPersonalEditByID и SavePersonal.
да, нарушения есть в этих методах. Но разве это так страшно? Да и откровенно говоря всегда ли там безнес-объекты ( тут это же DTO вроде?) так сильно отличаются от объектов в БД?:) Судя по ссылки выше у ТС они не отличаются. А строго следовать определению какого-то паттерна имхо ненужно. Вот.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514654
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КЭта "красота" вызовет в дальнейшем необходимость описания специального DTO, что нарушает моё представление о DRY, но об этом ниже. Одним словом - оно того не стоит.Алексей КБизнес-объекты слоя данных и логики применяются в том числе в качестве DTO, чтобы не описывать одинаковые структуры данных в нескольких местах.Всё это замечательно работает пока один формат хранения данных, один формат их передачи, один способ получения.Например, добавим второй WCF ServiceHost для второго протокола. Прикладной код от этого не изменится.

skyANAНо что будет, если при развитии проекта, что-то добавится, или изменится? Насколько Ваше решение гибкое и масштабируемое? Нужен пример. В противном случае ответ будет: "Решение очень гибкое и очень масштабируемое". :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38514655
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivan, обратимся к определению: Repository .

П. 1A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection.
П. 2Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers.
С натяжкой можно сказать, что первый пункт выполняется, если предположить, что DTO объекты типа PersonalView и есть доменные объекты.
Но вот второй пункт не выполняется. Смотрите методы GetPersonalEditNew, GetPersonalEditByID и SavePersonal.Ну и пусть класс там чему-то не соответствует. Хуже он от этого не становится.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514658
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНу и если говорить о SOLID, то явное нарушение принципа Single responsibility: класс и репозиторий, и маппер, и сервис.SvcPersonal - класс, содержащий логику. PersonalView - класс, содержащий данные. Никакого нарушения SRP тут нет.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514666
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivan, помешает то, что нельзя быстро и незаметно добавить или изменить формат хранения данных, формат их передачи, способ получения.Повторюсь, WCF это позволяет. Это что касается передачи. Что касается хранения и обработки - проект жёстко завязан на EF, отказываться от него смысла не вижу.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514924
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К"Решение очень гибкое и очень масштабируемое". :-)
Алексей Кпроект жёстко завязан на EF
...
Рейтинг: 0 / 0
О применении SOLID
    #38514926
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, сколько лет будет жить сей проект. Сколько вообще лет существуют ваши продукты.
Хотя нет, не интересно.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514953
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, Ну это же корпоративное решение, усугубленное ж.д. тематикой, выставленное наружу, т.е. вполне может жить ( если компилится)..
...
Рейтинг: 0 / 0
О применении SOLID
    #38514963
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, я это прекрасно понимаю и нигде не писал, что решение не имеет права жить.
...
Рейтинг: 0 / 0
О применении SOLID
    #38514966
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,
Хорош качели раскачивать -"вполне может жить " глобальная переменная, к вашему стеку отношения не имеет.
зы Это лозунг...
...
Рейтинг: 0 / 0
О применении SOLID
    #38514972
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, что понимается под "вашим стеком"?
...
Рейтинг: 0 / 0
О применении SOLID
    #38515272
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAnetivan, обратимся к определению: Repository .

пропущено...

пропущено...

С натяжкой можно сказать, что первый пункт выполняется, если предположить, что DTO объекты типа PersonalView и есть доменные объекты.
Но вот второй пункт не выполняется. Смотрите методы GetPersonalEditNew, GetPersonalEditByID и SavePersonal.
да, нарушения есть в этих методах. Но разве это так страшно? Да и откровенно говоря всегда ли там безнес-объекты ( тут это же DTO вроде?) так сильно отличаются от объектов в БД?:) Судя по ссылки выше у ТС они не отличаются. А строго следовать определению какого-то паттерна имхо ненужно. Вот.

Когда у тебя будет хотя бы за сотню объектов, то без обобщенного репозитория, без возможности пересобрать на автомате все классы и создать необходимые сервисы, тебе очень быстро станет не страшно, а тошно.
Это игрушки в ООП там, где его не должно быть и ручное вышивание крестиком на ровном месте.
Фреймворк с одной только жесткой связанностью без гибкости в членах, который не упрощает и не ускоряет разработку.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515402
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANASeVaВряд ли у вас получиться что-либо доказать силой мысли. Нужны конкретные примеры. Упражнения в красноречии и разговоры о сферических конях не интересны.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515433
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

ты много читаешь и изучаешь- какие шансы у Microsoft StreamInsight в роли AppServerа?
...
Рейтинг: 0 / 0
О применении SOLID
    #38515456
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANASeVaВряд ли у вас получиться что-либо доказать силой мысли. Нужны конкретные примеры. Упражнения в красноречии и разговоры о сферических конях не интересны.

Алексей, я в эти игры играю давно, уже сделан не один проект и знаю о чем говорю.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515460
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават ЮсифовSeVa,

ты много читаешь и изучаешь- какие шансы у Microsoft StreamInsight в роли AppServerа?

StreamInsight решает достаточно ограниченный круг задач - потоки данных и их обработка.
В качестве app server'a больше подходит owin/katana/web api.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515585
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANASeVaВряд ли у вас получиться что-либо доказать силой мысли. Нужны конкретные примеры. Упражнения в красноречии и разговоры о сферических конях не интересны.Примеры чего Вам нужны? Что Ваше решение менее гибкое, чем с пресловутым репозиторием?
Дак Вы сами признали, что проект жёстко увязан c EF. Тесты без БД не запустишь, с Memcached не поиграешься.

А доказывать я ничего и не собирался. Но если хотите, то можем доказать, что SRP Вы не соблюдаете.

Кака единственная ответственность лежит на классе SvcPersonal? Только не говорите: содержать логику.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515819
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaАлексей, я в эти игры играю давно , уже сделан не один проект и знаю о чем говорю.Игроман? :-)

Некогда мне тут в диконтейнеры играть. Мне важен результат а не процесс. Как только от диконтейнера в моих проектах будет польза, он обязательно будет использован. А пока в нём смысла нет.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515825
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
пропущено...
Вряд ли у вас получиться что-либо доказать силой мысли. Нужны конкретные примеры. Упражнения в красноречии и разговоры о сферических конях не интересны.Примеры чего Вам нужны? Что Ваше решение менее гибкое, чем с пресловутым репозиторием?Аналогичный код, написанный "правильно". Ваша инкапсуляция откровенно говоря не впечатлила.
skyANAДак Вы сами признали, что проект жёстко увязан c EF.Да.
skyANAТесты без БД не запустишь, с Memcached не поиграешься. И не надо. Мне проще подготовить БД с тестовыми данными.
skyANAА доказывать я ничего и не собирался. Но если хотите, то можем доказать, что SRP Вы не соблюдаете.

Кака единственная ответственность лежит на классе SvcPersonal? Только не говорите: содержать логику.
skyANAНу и если говорить о SOLID, то явное нарушение принципа Single responsibility: класс и репозиторий, и маппер, и сервис.Ну давайте попробуем:

Репозитарий - Да.
Маппер - Нет, маппинг DbDataReader -> Object производит EF.
Сервис - этим занимается WCF, на прикладном коде это практически никак не отражается.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515902
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaАлексей, я в эти игры играю давно , уже сделан не один проект и знаю о чем говорю.Игроман? :-)

Некогда мне тут в диконтейнеры играть. Мне важен результат а не процесс. Как только от диконтейнера в моих проектах будет польза, он обязательно будет использован. А пока в нём смысла нет.

Ну, в игрушки собственного производства это ты до сих пор играешь. Чужие осилить еще не можешь.
...
Рейтинг: 0 / 0
О применении SOLID
    #38515933
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЧужие осилить еще не можешь.Почему ты так решил?
...
Рейтинг: 0 / 0
О применении SOLID
    #38515953
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Примеры чего Вам нужны? Что Ваше решение менее гибкое, чем с пресловутым репозиторием?Аналогичный код, написанный "правильно". Ваша инкапсуляция откровенно говоря не впечатлила.
skyANAДак Вы сами признали, что проект жёстко увязан c EF.Да.
skyANAТесты без БД не запустишь, с Memcached не поиграешься. И не надо. Мне проще подготовить БД с тестовыми данными.
skyANAА доказывать я ничего и не собирался. Но если хотите, то можем доказать, что SRP Вы не соблюдаете.

Кака единственная ответственность лежит на классе SvcPersonal? Только не говорите: содержать логику.
skyANAНу и если говорить о SOLID, то явное нарушение принципа Single responsibility: класс и репозиторий, и маппер, и сервис.Ну давайте попробуем:

Репозитарий - Да.
Маппер - Нет, маппинг DbDataReader -> Object производит EF.
Сервис - этим занимается WCF, на прикладном коде это практически никак не отражается.
На базе объектов EF легко сделать репозиторий этот пресловутый. Почему вы не сделали?))
...
Рейтинг: 0 / 0
О применении SOLID
    #38515956
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanНа базе объектов EF легко сделать репозиторий этот пресловутый. Почему вы не сделали?))Говорят, не умею. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38516158
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Примеры чего Вам нужны? Что Ваше решение менее гибкое, чем с пресловутым репозиторием?Аналогичный код, написанный "правильно". Ваша инкапсуляция откровенно говоря не впечатлила.А я и не преследовал цели впечатлить Вас.

То был банальный пример, как ограничить доступ к состоянию объекта. То есть банальный пример инкапсуляции.

Просто запомните, вдруг понадобится.

Алексей КskyANAДак Вы сами признали, что проект жёстко увязан c EF.Да.
skyANAТесты без БД не запустишь, с Memcached не поиграешься. И не надо. Мне проще подготовить БД с тестовыми данными.А готовите? Пишите тесты? Что-то я их рядом с проектом не заметил.

Алексей КskyANAА доказывать я ничего и не собирался. Но если хотите, то можем доказать, что SRP Вы не соблюдаете.

Кака единственная ответственность лежит на классе SvcPersonal? Только не говорите: содержать логику.
skyANAНу и если говорить о SOLID, то явное нарушение принципа Single responsibility: класс и репозиторий, и маппер, и сервис.Ну давайте попробуем:

Репозитарий - Да.Помимо основной функции репозитория я вижу ещё и некоторую логику, типа "упс, такому входному параметру соответствует более одного элемента, ловите исключение". Плюс валидация данных.
Что также нарушает принцип того, что повод для изменения должен быть только один. Валидацию я бы выделил в отдельный компонент - PersonalValidator.

Алексей КМаппер - Нет, маппинг DbDataReader -> Object производит EF.А я не про data mapping, а про personal -> PersonalView.

Алексей КСервис - этим занимается WCF, на прикладном коде это практически никак не отражается.Предложат Вам с новом году: Алексей, а давай заменим WCF сервис на RESTful на базе WebAPI, - и придётся Вам код копипастить в ApiController.
...
Рейтинг: 0 / 0
О применении SOLID
    #38516159
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КnetivanНа базе объектов EF легко сделать репозиторий этот пресловутый. Почему вы не сделали?))Говорят, не умею. :-)Пока у Вас нет полноценного репозитория, что отдаёт чистые доменные объекты, не завязанные на EF и System.Runtime.Serialization.
...
Рейтинг: 0 / 0
О применении SOLID
    #38516180
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КИ не надо. Мне проще подготовить БД с тестовыми данными.А готовите? Пишите тесты? Что-то я их рядом с проектом не заметил.Потому что этот проект не содержит логики, достойной организации для неё полноценного тестирования. Для системных библиотек у меня есть тесты, но я их не стал выкладывать. Не думаю, что они будут кому-то интересны.
skyANAПомимо основной функции репозитория я вижу ещё и некоторую логику, типа "упс, такому входному параметру соответствует более одного элемента, ловите исключение". Плюс валидация данных.
Что также нарушает принцип того, что повод для изменения должен быть только один. Валидацию я бы выделил в отдельный компонент - PersonalValidator.Получится класс с одним маленьким методом. Недостаточная ответственность класса Вас не пугает?
skyANAАлексей КМаппер - Нет, маппинг DbDataReader -> Object производит EF.А я не про data mapping, а про personal -> PersonalView.

Алексей КСервис - этим занимается WCF, на прикладном коде это практически никак не отражается.Предложат Вам с новом году: Алексей, а давай заменим WCF сервис на RESTful на базе WebAPI, - и придётся Вам код копипастить в ApiController.Копипастить не придётся. По факту будет произведено выделение класса. Дадим ему тогда гордое имя PersonalRepository.
...
Рейтинг: 0 / 0
О применении SOLID
    #38516370
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КСервис - этим занимается WCF, на прикладном коде это практически никак не отражается.Предложат Вам с новом году: Алексей, а давай заменим WCF сервис на RESTful на базе WebAPI, - и придётся Вам код копипастить в ApiController.Но это фантастика. Вероятнее будет предложено добавить доступ через HTTP, как это нынче принято в интеграциях. На что будет добавлен ещё один WCF ServiceHost, как я уже писал ранее. Прикладной код это вообще никак не коснётся.
...
Рейтинг: 0 / 0
О применении SOLID
    #38516398
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КМаппер - Нет, маппинг DbDataReader -> Object производит EF.А я не про data mapping, а про personal -> PersonalView.Это не мапинг, это прикладная логика.
...
Рейтинг: 0 / 0
О применении SOLID
    #38516477
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей, забудь про солид в своих гавноклассах, кури вот это :) http://codearticles.ru/articles/2407
...
Рейтинг: 0 / 0
О применении SOLID
    #38521288
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей, забудь про солид в своих гавноклассах, кури вот это :) http://codearticles.ru/articles/2407 В кодогенераторе EF-контекста есть репозитарий . Так что можно расслабиться и успокоиться. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521298
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУАлексей, забудь про солид в своих гавноклассах, кури вот это :) http://codearticles.ru/articles/2407 В кодогенераторе EF-контекста есть репозитарий . Так что можно расслабиться и успокоиться. :-)

Красота :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
isnull((
                        select top 1
                            major_id 
                        from sys.extended_properties ep
                        where 
                            ep.major_id = o.object_id and
                            ep.minor_id = 0 and
                            ep.class = 1 and
                            ep.name = N'microsoft_database_tools_support'
                    ), 0) = 0



http://msdn.microsoft.com/ru-ru/library/ms188336.aspx
...
Рейтинг: 0 / 0
О применении SOLID
    #38521309
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
В кодогенераторе EF-контекста есть репозитарий . Так что можно расслабиться и успокоиться. :-)

Красота :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
isnull((
                        select top 1
                            major_id 
                        from sys.extended_properties ep
                        where 
                            ep.major_id = o.object_id and
                            ep.minor_id = 0 and
                            ep.class = 1 and
                            ep.name = N'microsoft_database_tools_support'
                    ), 0) = 0



http://msdn.microsoft.com/ru-ru/library/ms188336.aspx Там exists не катит. Там надо учитывать в том числе значение поля major_id существующей записи.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521322
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТам exists не катит. Там надо учитывать в том числе значение поля major_id существующей записи.
Ну так добавить в where условие major_id is null и обернуть это дело в exists ))
...
Рейтинг: 0 / 0
О применении SOLID
    #38521332
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КТам exists не катит. Там надо учитывать в том числе значение поля major_id существующей записи.
Ну так добавить в where условие major_id is null и обернуть это дело в exists ))Зачем? И так всё прекрасно работает.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521435
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Говорят, не умею. :-)Пока у Вас нет полноценного репозитория, что отдаёт чистые доменные объекты, не завязанные на EF и System.Runtime.Serialization.
да спорный это момент конечно. Ну реально репозиторий на объектах EF будет хватать в большинстве случаев. Чтобы не делать потом сто раз маппинги.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521466
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAпропущено...
Пока у Вас нет полноценного репозитория, что отдаёт чистые доменные объекты, не завязанные на EF и System.Runtime.Serialization.
да спорный это момент конечно. Ну реально репозиторий на объектах EF будет хватать в большинстве случаев. Чтобы не делать потом сто раз маппинги.Data Mapping - это не ответсвенность репозитория. Подозреваю, что в большинстве Ваших случаев репозиторий вообще не нужен.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521500
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAData Mapping - это не ответсвенность репозитория.Особенно Mapping DbDataReader => Object.
skyANAПодозреваю, что в большинстве Ваших случаев репозиторий вообще не нужен.Звучит осуждающе.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521512
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПока у Вас нет полноценного репозитория, что отдаёт чистые доменные объекты, не завязанные на EF и System.Runtime.Serialization.EF DbContext API рассчитан на то, чтобы бизнес-объекты ничего не знали про EF. Особенно если использовать Fluent API.

WCF требует от классов только атрибуты. Тут зависимости тоже особо никакой.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521521
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAData Mapping - это не ответсвенность репозитория.Особенно Mapping DbDataReader => Object.
Он про маппинг доменных объектов. Маппингом репозиторий не занимается. Маппить может контроллер или иная промежуточная абстраккция. Например, есть доменный объект и модель представления. Кто должен смапить их как в одну, так и в другую сторону? Правильно, кто угодно, но только не репозиторий.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521528
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО пока данные лежат в одном месте и нет необходимости в нескольких вариантах доступа к ним, то сложно понять суть репозитория, в особенности следующей фразы из описания шаблона: "код распределения данных, скрытый в объекте Repository, позаботится о соответсвующих операциях незаметно для разработчика".

Например у нас в проекте имеется следующий интерфейс:
Код: c#
1.
public interface IRepository<T> where T : IEntity


И несколько вариантов реализации:
Код: c#
1.
public class SqlServerRepository<T> : IRepository<T> where T : IEntity


Код: c#
1.
public class MongoDbRepository<T> : IRepository<T> where T : IEntity


Код: c#
1.
public class CacheRepository<T> : IRepository<T> where T : IEntity


Код: c#
1.
internal class LockSafeRepository<T> : IRepository<T> where T : IEntity


Почему так?
Потому что у нас основное хранилище - это Sql Server.
Часть данных/сущностей/Entity хранится в MongoDB.
Часть данных/сущностей/Entity необходимо кэшировать.
Часть данных/сущностей/Entity, что хранится в MongoDB участвует в транзакциях, а монго их не поддерживает. Необходима своя реализация.

Причём кэш и поддержка транзакционности не нужна в ряде случаев: миграция, клонирование, перенос данных между базами и нодами, нагрузочное тестирование,. Попросту говоря тут необходимо включить, тут отключить незаметно для вызывающего кода.

Вот такие пироги. Говорите репозитория на объектах EF хватит?
...
Рейтинг: 0 / 0
О применении SOLID
    #38521539
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Особенно Mapping DbDataReader => Object.
Он про маппинг доменных объектов.Сори, у меня телепатор в ремонте. :-)
МСУМаппингом репозиторий не занимается. Маппить может контроллер или иная промежуточная абстраккция. Например, есть доменный объект и модель представления. Кто должен смапить их как в одну, так и в другую сторону? Правильно, кто угодно, но только не репозиторий.Маппинг сам по себе - зло. Не надо описывать одинаковые структуры данных в разных классах и никакие маппинги не потребуются.

Единственное место где нужен специальный DTO - это при написании вебсервиса для интеграции с внешней системой. Там важно гарантировать постоянный контракт.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521540
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAData Mapping - это не ответсвенность репозитория.Особенно Mapping DbDataReader => Object.
skyANAПодозреваю, что в большинстве Ваших случаев репозиторий вообще не нужен.Звучит осуждающе.Ну вот Вам достаточно Data Mapper . Осуждать тут нечего.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521543
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Особенно Mapping DbDataReader => Object.
пропущено...
Звучит осуждающе.Ну вот Вам достаточно Data Mapper . Осуждать тут нечего.Звучит зловещще. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521545
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Ну вот Вам достаточно Data Mapper . Осуждать тут нечего.Звучит зловещще. :-)Вы мнительный человек?
...
Рейтинг: 0 / 0
О применении SOLID
    #38521549
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПочему так?
Потому что у нас основное хранилище - это Sql Server.
Часть данных/сущностей/Entity хранится в MongoDB.
Часть данных/сущностей/Entity необходимо кэшировать.
Часть данных/сущностей/Entity, что хранится в MongoDB участвует в транзакциях, а монго их не поддерживает. Необходима своя реализация.А у нас в квартире газ...
...
Рейтинг: 0 / 0
О применении SOLID
    #38521553
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Звучит зловещще. :-)Вы мнительный человек?Топик про SOLID или мою мнительность?
...
Рейтинг: 0 / 0
О применении SOLID
    #38521557
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAПочему так?
Потому что у нас основное хранилище - это Sql Server.
Часть данных/сущностей/Entity хранится в MongoDB.
Часть данных/сущностей/Entity необходимо кэшировать.
Часть данных/сущностей/Entity, что хранится в MongoDB участвует в транзакциях, а монго их не поддерживает. Необходима своя реализация.А у нас в квартире газ...ЧТД. Выше я писал, что у тем, у кого в квартире только газ, не понять.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521564
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Вы мнительный человек?Топик про SOLID или мою мнительность?Про SOLID. Так что поверьте мне на слово, что в моих словах нет ничего зловещего, и вернёмся к сабжу.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521574
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
А у нас в квартире газ...ЧТД. Выше я писал, что у тем, у кого в квартире только газ, не понять.Вы правда верите, что я не могу себе представить ситуацию, в которой репозитарий действительно нужен?
...
Рейтинг: 0 / 0
О применении SOLID
    #38521581
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAчто в моих словах нет ничего зловещегоА в моих словах один сарказм, никакой мнительности. Уж поверьте. :-)
skyANAвернёмся к сабжуДа.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521597
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
ЧТД. Выше я писал, что у тем, у кого в квартире только газ, не понять.Вы правда верите, что я не могу себе представить ситуацию, в которой репозитарий действительно нужен?Вы уже не раз писали, что если бы у вас было вот так, или сяк, то репозиторий был бы нужен. Так что какое-то представление Вы имеете.
Но по всей видимости у Вас нет необходимого практического опыта таких проектов, чтобы произвести качественную оценку.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521613
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Вы правда верите, что я не могу себе представить ситуацию, в которой репозитарий действительно нужен?Вы уже не раз писали, что если бы у вас было вот так, или сяк, то репозиторий был бы нужен. Так что какое-то представление Вы имеете.
Но по всей видимости у Вас нет необходимого практического опыта таких проектов, чтобы произвести качественную оценку.
очень интересно, если репозиторий не занимается маппингом, то кто им занимается? Или репозиторий все же опреирует доменными объектами (читай объектами EF)? Что будет в виде Т в этом интерфейсе (IRepository<T>?)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521630
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Вы правда верите, что я не могу себе представить ситуацию, в которой репозитарий действительно нужен?Вы уже не раз писали, что если бы у вас было вот так, или сяк, то репозиторий был бы нужен. Так что какое-то представление Вы имеете.На это способен любой автор, владеющий общими принципами ООП и здравым смыслом. Для этого много ума не надо.
skyANAНо по всей видимости у Вас нет необходимого практического опыта таких проектов, чтобы произвести качественную оценку.По всей видимости мы обсуждаем конкретный проект а не коня в вакууме, но меня не перестаёт удивлять Ваше высокомерие, даже немного нравится.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521634
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanочень интересно, если репозиторий не занимается маппингом, то кто им занимается? Или репозиторий все же опреирует доменными объектами (читай объектами EF)? Что будет в виде Т в этом интерфейсе (IRepository<T>?)Не нужно искать смысл там где его нет. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521645
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAпропущено...
Вы уже не раз писали, что если бы у вас было вот так, или сяк, то репозиторий был бы нужен. Так что какое-то представление Вы имеете.
Но по всей видимости у Вас нет необходимого практического опыта таких проектов, чтобы произвести качественную оценку.
очень интересно, если репозиторий не занимается маппингом, то кто им занимается? Или репозиторий все же опреирует доменными объектами (читай объектами EF)? Что будет в виде Т в этом интерфейсе (IRepository<T>?)Мы ходим по кругу.
Вот ссылка на определение: Repository (Репозиторий) .

Цитирую:Описание Repository Посредничает между уровнями области определения и распределения данных (domain and data mapping layers), используя интерфейс, схожий с коллекциями для доступа к объектам области определения.T - это тип доменного объекта (объекта области определения), или иначе бизнес-объекта.

А маппингом занимается маппер. :)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521647
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кnetivanочень интересно, если репозиторий не занимается маппингом, то кто им занимается? Или репозиторий все же опреирует доменными объектами (читай объектами EF)? Что будет в виде Т в этом интерфейсе (IRepository<T>?)Не нужно искать смысл там где его нет. :-) просто я не понимаю тогда смысл наезда от товарища. Кроме чего-то типа "надо делать так" и если вы не согласны, то вам это не по "уму". Как по мне, то репозитория на базе объектов Ef хватает сполна. Если нужна супер бизнес транзакция, не вижу в этом противоречия. Будет вам еще одна едицина работы на базе этого репозитория. А что он вернет назовите хоть горшком. Зачем для этого бестоклу мапить объекты ? Из-за гипотетической возможности, что у нас БД изменится завтра резко?
...
Рейтинг: 0 / 0
О применении SOLID
    #38521648
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

...
Рейтинг: 0 / 0
О применении SOLID
    #38521657
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanпросто я не понимаю тогда смысл наезда от товарища.Я тоже. :-)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521660
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кnetivanпросто я не понимаю тогда смысл наезда от товарища.Я тоже. :-)Потому как нет никакого наезда. :)
...
Рейтинг: 0 / 0
О применении SOLID
    #38521678
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кnetivanпросто я не понимаю тогда смысл наезда от товарища.Я тоже. :-)
Товарещ пишет всё правильно, просто вы не хотите внять сути
...
Рейтинг: 0 / 0
О применении SOLID
    #38521687
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Я тоже. :-)Потому как нет никакого наезда. :)Хорошо, если так.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521688
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanАлексей Кпропущено...
Не нужно искать смысл там где его нет. :-) просто я не понимаю тогда смысл наезда от товарища.А процитируйте мой наезд, я перефразирую свою мысль, чтобы было понятно, что я хотел сказать, и она не вызывала ошибочного толкования.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521721
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanЗачем для этого бестоклу мапить объекты?Не понял вопроса.

Маппить надо, потому что структура хранения в БД отличается от структуры бизнес-объектов.
netivanИз-за гипотетической возможности, что у нас БД изменится завтра резко?Нет :)
Не гипотетических предположениях о том, как будет развиваться проект, денег не заработаешь. Скорее случится фейл.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521733
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivanЗачем для этого бестоклу мапить объекты?Не понял вопроса.

Маппить надо, потому что структура хранения в БД отличается от структуры бизнес-объектов.
netivanИз-за гипотетической возможности, что у нас БД изменится завтра резко?Нет :)
Не гипотетических предположениях о том, как будет развиваться проект, денег не заработаешь. Скорее случится фейл.
вот в авторМаппить надо, потому что структура хранения в БД отличается от структуры бизнес-объектов. этом вся соль. А если не отличается?(очень похожа)? Возьмем известный пример бд Northwind. Что там маппить будете? Покажите мастер-класс.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521749
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К теме про Алексеевский "EF решит все вопросы"...

...
Рейтинг: 0 / 0
О применении SOLID
    #38521756
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAпропущено...
Не понял вопроса.

Маппить надо, потому что структура хранения в БД отличается от структуры бизнес-объектов.
пропущено...
Нет :)
Не гипотетических предположениях о том, как будет развиваться проект, денег не заработаешь. Скорее случится фейл.
вот в авторМаппить надо, потому что структура хранения в БД отличается от структуры бизнес-объектов. этом вся соль. А если не отличается?(очень похожа)? Возьмем известный пример бд Northwind. Что там маппить будете? Покажите мастер-класс.Тоже что маппится внутри EF :) Вы же не думаете, что внутри EF преобразование реляционных данных в объекты реализовано каким-то другим чудесным образом, так ведь?

Вообщем Вы наверное хотели спросить: зачем нужно выделять отдельные бизнес-объекты, не связанные с EF и маппить данные на них?
...
Рейтинг: 0 / 0
О применении SOLID
    #38521789
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

да, мы же ведет дискуссию про объекты EF и новые бизнес-объекты. Я вот спросил на примере конкретной БД.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521814
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANA,

да, мы же ведет дискуссию про объекты EFПозволю себе некоторую иронию: Работа с объектами (платформа Entity Framework) .

Интересно, зачем в EF поддерживается четыре типа сущностей: EntityObject, POCO, Прокси POCO и Сущности с самостоятельным отслеживанием? Разве одного типа не достаточно для большинства проектов?

Сам я с EF не работал, поэтому хотелось бы услышать Ваши комментарии.
netivanЯ вот спросил на примере конкретной БД.К сожалению я не работал с БД Northwind и не знаком с её структурой. Насколько я знаю, это учебная база от MS.
Фишка в том, что в институте на лабах у нас была Delphi Paradox Database, карьеру я начал с Oracle, а когда столкнулся с Sql Server, то учебные базы ковырять уже не имело смысла.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521869
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья, вообще солид - это УГ. Всё, все по домам. ))
...
Рейтинг: 0 / 0
О применении SOLID
    #38521975
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

что-то в тупик меня поставили. Я кстати не особый знаток ЕФ,достаточно давно с ним работал. Но если честно не вижу для нашей беседы разницы в тех походах. А про БД Northwind вы загнули она достаточно типичная.
...
Рейтинг: 0 / 0
О применении SOLID
    #38521999
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, что я загнул про БД Northwind? Что не работал с ней? Действительно не работал. Убедите меня в обратном.

Погуглил:technet.microsoft.comThe Northwind and pubs sample databases are not installed by default in Microsoft SQL Server.technet.microsoft.comThe AdventureWorks2008R2 sample databases that are used in the code examples in SQL Server Books Online can be downloaded from the Microsoft SQL Server Samples and Community Projects home page.Это я к тому, что даже краем глаза не мог видеть БД Northwind, т.к. её отдельно надо скачивать и прикреплять к инстансу сервера.

А что значит "она достаточно типичная"?
...
Рейтинг: 0 / 0
О применении SOLID
    #38522106
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

авторА что значит "она достаточно типичная"? типичное решение типичной задачи. Клиенты, продажи и т.д. Да и вообще я всего лишь хотел донести мысль, что следовать принципам потому что так написано где-то имхо глупо и неправильно. Если модели домена и бизнеса совпадают это сразу неправильно и плохо? Бред.
...
Рейтинг: 0 / 0
О применении SOLID
    #38522152
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanЕсли модели домена и бизнеса совпадают это сразу неправильно и плохо? Бред.
Что такое "модель бизнеса"?
...
Рейтинг: 0 / 0
О применении SOLID
    #38522160
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANA,

авторА что значит "она достаточно типичная"? типичное решение типичной задачи. Клиенты, продажи и т.д. Да и вообще я всего лишь хотел донести мысль, что следовать принципам потому что так написано где-то имхо глупо и неправильно. Если модели домена и бизнеса совпадают это сразу неправильно и плохо? Бред.Хм. Клиенты, продажи и т.д. Какой хороший пример :)

Значит есть заказы. В заказе есть шапка/заголовок/основная часть и товары/услуги/детализация.
В реляционной БД это минимум две сущности/таблицы (в реальности конечно больше, т.к. есть всякие справочные данные типа валюты, единиц измерения и т.п.), в коде доменной модели одна - заказ (агрегирующая).

По Вашему тут нужен маппинг или нет? :)

P.S.: а я разве предлагал слепо следовать принципам?
...
Рейтинг: 0 / 0
О применении SOLID
    #38522170
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВ реляционной БД это минимум две сущности/таблицы (в реальности конечно больше, т.к. есть всякие справочные данные типа валюты, единиц измерения и т.п.), в коде доменной модели одна - заказ (агрегирующая).Тут имеется ввиду, что данные в БД раскиданы по нескольким таблицам, а инстансе заказа они собраны.
...
Рейтинг: 0 / 0
О применении SOLID
    #38522298
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAskyANAВ реляционной БД это минимум две сущности/таблицы (в реальности конечно больше, т.к. есть всякие справочные данные типа валюты, единиц измерения и т.п.), в коде доменной модели одна - заказ (агрегирующая).Тут имеется ввиду, что данные в БД раскиданы по нескольким таблицам, а инстансе заказа они собраны.
а там в EF будет все что нужно в связанной коллекции :). Но если даже предположить что надо получить имя какого-то справочника для заказа, то какой-то код приложения дернет 2 репозитория (например) и заполнит некий объект. Но помойму это не маппинг, а уже совсем логика /контроллер/ хуеллер. Например пусть это будет в методе WCF сервиса СформироватьЗаказ НОМЕР ХХХ
...
Рейтинг: 0 / 0
О применении SOLID
    #38522335
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAпропущено...
Тут имеется ввиду, что данные в БД раскиданы по нескольким таблицам, а инстансе заказа они собраны.
а там в EF будет все что нужно в связанной коллекции :). Но если даже предположить что надо получить имя какого-то справочника для заказа, то какой-то код приложения дернет 2 репозитория (например) и заполнит некий объект. Но помойму это не маппинг, а уже совсем логика /контроллер/ хуеллер. Например пусть это будет в методе WCF сервиса СформироватьЗаказ НОМЕР ХХХВы смешали всё в кучу и пишете глупости.

Давайте разбираться:

1. 2 репозитория тут не нужно. Заказ является корнем агрегации (почитайте на досуге про этот термин) и достаточно одного репозитория, что возвращает заказы;
2. Репозиторий не отвечает за маппинг, репозиторий дёргает EF;
3. EF - это ORM, что расшифровывается как object-relational mapping.

То есть если Вы используете EF напрямую, без прослойки в виде репозитория, или внутри реализации репозитория, то маппинг выполняется.
Если Вы не используете EF, или какой другой ORM, то придётся писать маппинг самостоятельно. И от того, что Вы его ручками напишите, он не станет логикой/контроллером/хелпером.
...
Рейтинг: 0 / 0
О применении SOLID
    #38522347
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

вот видите, вы говорите "глупости", а я вам говорю что это не глупости. Давайте разбираться далее.
Под репозиторием я подразумеваю http://blogs.msdn.com/b/wriju/archive/2013/08/23/using-repository-pattern-in-entity-framework.aspx вот- что-то такое. И вполне может быть что при формировании "заказа" может потребоваться обращаться к нескольким таким репозиториям. В конце концов представим что у нас не EF c готовыми маппингами связанных сущностей а самописный слой. В чем глупость?
...
Рейтинг: 0 / 0
О применении SOLID
    #38522351
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, не спешите. Я Вам задал прямой вопрос: "По Вашему тут нужен маппинг или нет?".
Давайте сначала на него ответим, а потом уже будем разбираться с количеством репозиториев :)
...
Рейтинг: 0 / 0
О применении SOLID
    #38522363
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет. Давайте сразу на Ваш вопрос ответим:netivanВозьмем известный пример бд Northwind. Что там маппить будете?
Маппить (отображать) будем данные из нескольких таблиц БД на одну доменную сущность - заказ. Согласны?
...
Рейтинг: 0 / 0
О применении SOLID
    #38522395
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAХотя нет. Давайте сразу на Ваш вопрос ответим:netivanВозьмем известный пример бд Northwind. Что там маппить будете?
Маппить (отображать) будем данные из нескольких таблиц БД на одну доменную сущность - заказ. Согласны?
я вам косвенно ответил уже.
авторЗначит есть заказы. В заказе есть шапка/заголовок/основная часть и товары/услуги/детализация.
Имеем заказ как бизнес-сущность, совсем не связанную с БД, так?
Чтобы "собрать" заказ я буду обращаться к разным сущностям Бд через репозиторий EF (например). И вся логика работы с заказом будет в отдельном классе/сервисе/контроллере. Только я бы это маппингом не стал называть ибо вывести Заголовок как вы сказали в виде больших букв,например, задача совсем не репозитория с маппингами :) Если вы намекаете, что тем самым я буду дублировать код например в сервисе и веб-приложении, то да, такое может быть и тогда этот бизнес-объект с логикой будет в отдельном месте, а уже результат его работы будут использоваться все по своему.
ЗЫ наверное пример с большими буквами неудачный, тут сразу закидаете что это "представление". Пусть будет лучше какая-то сложная формула для суммы заказа.
ЗЫ фух, слишком для вечера пятницы!
...
Рейтинг: 0 / 0
О применении SOLID
    #38522417
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, Вы скачете с пятого на десятое и путаетесь.

Ещё раз сначала:

1. в БД две таблицы: Orders (шапка/заголовок/основная часть заказа) и OrderDetails (товары/услуги/детализация по заказу);
2. с точки зрения доменной модели одна сущность: Order (заказ).

Вам нужно представить данные, что лежат в БД в виде сущности доменной модели (экземпляра класса Order), согласны?

Это называется object-relational mapping. Отображение реляционнных данных на объект области определения.
Бизнес логика работы с заказом нам тут пока на фиг не нужна, код этой логики отрабатывал, когда заказ оформляли (генерировался номер заказа, учитывались всякие скидки/наценки).

Ни про какие выводы Заголовка куда-то там в представление я не писал, и уж тем более не называл это маппингом.
...
Рейтинг: 0 / 0
О применении SOLID
    #38522422
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanЗЫ наверное пример с большими буквами неудачный, тут сразу закидаете что это "представление". Пусть будет лучше какая-то сложная формула для суммы заказа.Сложные формулы не нужны, так как уже применены, заказ оформлен, данные уже в БД. :)
...
Рейтинг: 0 / 0
О применении SOLID
    #38522424
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanЗЫ фух, слишком для вечера пятницы!Оно и видно
...
Рейтинг: 0 / 0
О применении SOLID
    #38522432
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivan, Вы скачете с пятого на десятое и путаетесь.

Ещё раз сначала:

1. в БД две таблицы: Orders (шапка/заголовок/основная часть заказа) и OrderDetails (товары/услуги/детализация по заказу);
2. с точки зрения доменной модели одна сущность: Order (заказ).

Вам нужно представить данные, что лежат в БД в виде сущности доменной модели (экземпляра класса Order), согласны?

Это называется object-relational mapping. Отображение реляционнных данных на объект области определения.
Бизнес логика работы с заказом нам тут пока на фиг не нужна, код этой логики отрабатывал, когда заказ оформляли (генерировался номер заказа, учитывались всякие скидки/наценки).

Ни про какие выводы Заголовка куда-то там в представление я не писал, и уж тем более не называл это маппингом.
да, я напутал. У меня это будет так OrderRepository<Order>, где Order это класс EF.
...
Рейтинг: 0 / 0
О применении SOLID
    #38522448
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAnetivan, Вы скачете с пятого на десятое и путаетесь.

Ещё раз сначала:

1. в БД две таблицы: Orders (шапка/заголовок/основная часть заказа) и OrderDetails (товары/услуги/детализация по заказу);
2. с точки зрения доменной модели одна сущность: Order (заказ).

Вам нужно представить данные, что лежат в БД в виде сущности доменной модели (экземпляра класса Order), согласны?

Это называется object-relational mapping. Отображение реляционнных данных на объект области определения.
Бизнес логика работы с заказом нам тут пока на фиг не нужна, код этой логики отрабатывал, когда заказ оформляли (генерировался номер заказа, учитывались всякие скидки/наценки).

Ни про какие выводы Заголовка куда-то там в представление я не писал, и уж тем более не называл это маппингом.
да, я напутал. У меня это будет так OrderRepository<Order>, где Order это класс EF.Замечательно!

Мы развеяли Ваши заблуждения о бестолковом маппинге:netivanЗачем для этого бестоклу мапить объекты?
И получили ровно один репозиторий. Ура! :)
...
Рейтинг: 0 / 0
О применении SOLID
    #38524149
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

не Ура, их несколько. Вот разгребу напишу код).Хотя возможно мы говорим об одном и том же.
...
Рейтинг: 0 / 0
О применении SOLID
    #38524300
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, для одного корня агрегации (aggregation root) достаточно одного репозитория.
...
Рейтинг: 0 / 0
О применении SOLID
    #38525335
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Я тоже. :-)Потому как нет никакого наезда. :)Мне наверное показалось . Собственно, с чего и был начат этот топик.
skyANAПосмотрев остальной код проекта, прихожу к выводу, что DRY (don’t repeat yourself) у Вас и не пахнет.
...
Рейтинг: 0 / 0
О применении SOLID
    #38525356
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

мы немного по-разному понимаю данный термин. Хорошо, в конкретном примере "Заказ" будет единственным нужным репозиторием. Вообщем вроде бы мы пришли в завершению темы. Может кто еще выскажется)
...
Рейтинг: 0 / 0
О применении SOLID
    #38526235
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Потому как нет никакого наезда. :)Мне наверное показалось . Собственно, с чего и был начат этот топик.
skyANAПосмотрев остальной код проекта, прихожу к выводу, что DRY (don’t repeat yourself) у Вас и не пахнет.Показалось. И мы начали обсуждать этот момент в начале топика.
...
Рейтинг: 0 / 0
О применении SOLID
    #38526238
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanмы немного по-разному понимаю данный термин. Хорошо, в конкретном примере "Заказ" будет единственным нужным репозиторием. Вообщем вроде бы мы пришли в завершению темы. Может кто еще выскажется)А как Вы его понимаете?

Мне кажется, что Вы уходите немного в сторону. Думаете к примеру о том, что где-то понадобится редактировать справочники, для этого понадобится ещё репозитории. Так?
...
Рейтинг: 0 / 0
О применении SOLID
    #38526272
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivanмы немного по-разному понимаю данный термин. Хорошо, в конкретном примере "Заказ" будет единственным нужным репозиторием. Вообщем вроде бы мы пришли в завершению темы. Может кто еще выскажется)А как Вы его понимаете?

Мне кажется, что Вы уходите немного в сторону. Думаете к примеру о том, что где-то понадобится редактировать справочники, для этого понадобится ещё репозитории. Так?
справочники отличный пример. Но вопрос я ваш не понял. Давайте так мой подход. на примере EF:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1. IRepository<T>
{
GetXXX(ID)
Save(T x)
Update(T x)
///еще всякие методы типа
}
2. OrderRepository:IRepository<OrderRepository:IRepository>,IOrderRepository
{
//методы Order
SaveOrderSpecial.
}
3.ВОт тут пример некого верхнего слоя, бизнес-сущностей.
SpecialOrderXXX
{
SaveSpecialOrder()
{// и вот тут могут быть всякие транзакции, использование репозиториве из п.2 и тд. Нужно при необходимости

}
}


вот как бы такой подход. Давайте критиковать его. МОжно на конкретном примере. Например, для Справочников п.3 не нужен вообще.
...
Рейтинг: 0 / 0
О применении SOLID
    #38526294
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, п. 3 - это у Вас уровень бизнес-логики, так?
...
Рейтинг: 0 / 0
О применении SOLID
    #38526312
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivan, п. 3 - это у Вас уровень бизнес-логики, так?
да.
...
Рейтинг: 0 / 0
О применении SOLID
    #38526317
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAnetivan, п. 3 - это у Вас уровень бизнес-логики, так?
да.Иначе говоря уровень области определения. Пока всё по феншуй
...
Рейтинг: 0 / 0
О применении SOLID
    #38526322
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivanпропущено...

да.Иначе говоря уровень области определения. Пока всё по феншуй
тогда о чем спор? Наверное моя мысль была в том, что п.3 далеко не всегда нужен. Возможно благодаря EF, где все же много можно сделать в репозитории п.2. =)
...
Рейтинг: 0 / 0
О применении SOLID
    #38526325
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAпропущено...
Иначе говоря уровень области определения. Пока всё по феншуй
тогда о чем спор? Наверное моя мысль была в том, что п.3 далеко не всегда нужен. Возможно благодаря EF, где все же много можно сделать в репозитории п.2. =)А спора нет. Вы просто забежали вперёд: перешли от контекста репозитория к бизнес-логике.

Последнюю не надо пихать в репозиторий, это не его ответсвенность.
...
Рейтинг: 0 / 0
О применении SOLID
    #38526351
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAnetivanпропущено...

тогда о чем спор? Наверное моя мысль была в том, что п.3 далеко не всегда нужен. Возможно благодаря EF, где все же много можно сделать в репозитории п.2. =)А спора нет. Вы просто забежали вперёд: перешли от контекста репозитория к бизнес-логике.

Последнюю не надо пихать в репозиторий, это не его ответсвенность.
ну я об этом раз сто твердил. Неужели мы сошлись на едином мнении?:)
...
Рейтинг: 0 / 0
О применении SOLID
    #38526496
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanskyANAпропущено...
А спора нет. Вы просто забежали вперёд: перешли от контекста репозитория к бизнес-логике.

Последнюю не надо пихать в репозиторий, это не его ответсвенность.
ну я об этом раз сто твердил. Неужели мы сошлись на едином мнении?:)О чём об этом? О споре? Логике? О её месте?
...
Рейтинг: 0 / 0
159 сообщений из 159, показаны все 7 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / О применении SOLID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]