powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / О применении SOLID
25 сообщений из 159, страница 1 из 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
25 сообщений из 159, страница 1 из 7
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / О применении SOLID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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