Последние темы Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Архив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
sheich: Изменение конфигурации работающего Windows сервиса на-лету
sheich
Member
Автор темы
1/383 ответов
20 лет на iXBT, с сентября 2004
Чаще пишет в "Игры" (49%)
Инфо Ответить
s
sheich Member Автор темы
  9 лет назад / 27 сентября 2016 18:15
Приложение написано с использованием Ninject
Регистрируется как Windows сервис
В процессе активации через ядро (Kernel) загружаются модули (NinjectModule) с многочисленными привязками (Bind)
Для некоторых привязок указываются параметры (WithConstructorArgument)
По умолчанию, при старте параметры считываются из конфигурационного файла, и сервис стартует как WCF
Нужно дать возможность, вызывая специальный метод сервиса переопределять некоторые параметры привязок. Ну, например, это параметры соединения с SQL-сервером, логин или что-то еще. Т.е., не перезапускать сервис заново, а именно переопределить параметры уже работающего экземпляра
Я понимаю, что как-то надо найти через Kernel работающий инстанс сервиса, его модули и сделать, например

var config = new myConfig() { ConnectionString = "..." };
var kernel = new StandardKernel(new DataAccessModule(config));

при этом, в DataAccessModule сказано:

private readonly myConfig _config;

public DataAccessModule(myConfig config)
{
_config = config;
}

public override void Load()
{
Bind<IRepository>().To<SqlRepository>()
.InSingletonScope()
.WithConstructorArgument(typeof(string), _config.ConnectionString);
}

а в SqlRepository:

public string _connectionString;
public SqlRepository(string connectionString)
{
_connectionString = connectionString;
}

но что-то ничего не получается...
причем, я даже уже вижу после "var kernel = new StandardKernel...", что ConnectionString в SqlRepository меняется, но последующие вызовы методов сервиса происходят с параметрами, установленными при первоначальном старте

как сделать, что бы изменения применились к работающему инстансу сервиса?
Konstantin Mironovich
Expert
4760/26486 ответов
25 лет на iXBT, с ноября 1999
Чаще пишет в "Политика" (35%)
Инфо Ответить
K
Konstantin Mironovich Expert
9 лет назад / 27 сентября 2016 19:59
sheich
но что-то ничего не получается...

а что хочется сделать? чисто идеологически, без привязки к конкретной реализации.

в native API, если создать сервис с правами SERVICE_USER_DEFINED_CONTROL, то можно посылать свои команды через функцию ControlService()
наверняка такая возможность есть и в .net

Добавление от 27.09.2016 20:14:

ладно.. есть и другой способ.
но про него все знают. так что не круто получится
vertur
заблокирован в конференции до 20 апреля 2025, 17:01
4042/4557 ответов, #6 в рейтинге
17 лет на iXBT, с марта 2008
Чаще пишет в "Программирование" (52%)
Гондурас, MN = мразь
Инфо Ответить
v
vertur заблокирован в конференции до 20 апреля 2025, 17:01
9 лет назад / 27 сентября 2016 22:36
А в чем проблема для вендосервиса перечитать конфигурацию при поступление внешнего сигнала ?
ash of mind
Member
1379/4860 ответов, #10 в рейтинге
17 лет на iXBT, с июля 2007
1 фото на iXBT.photo
Чаще пишет в "Программирование" (30%)
Инфо Ответить
a
ash of mind Member
9 лет назад / 28 сентября 2016 07:20
sheich
Я понимаю, что как-то надо найти через Kernel работающий инстанс сервиса, его модули и сделать, например
Неправильно понимаете. Ninject - это DI-фреймворк, его назначение - внедрение различных зависимостей. И его ядро вовсе не обязано знать о том, куда оно внедряет зависимость (а уж если не приведи б-г диконтейнер в проекте используется как сервис-локатор, то вы вообще этого не узнаете, т.к. внедрение может происходить в произвольной точке кода). Далее, в произвольный момент времени все зависимости уже внедрены; учитывая вышенаписанное (WithConstructorArgument) - в т.ч. при вызвовах конструкторов, т.е. повторный биндинг будет равносилен новому инстанциированию классов с внедренными зависимостями, что, по поему скромному, мало отличается от рестарта сервиса. В данном случае дело попахивает переписыванием сервиса так, чтобы 1) класс конфига мог слушать внешние события (например, через WCF named pipe, как выше написал Konstantin Mironovich); 2) оповещать своих читателей о факте изменения настроек, чтобы они могли перечитать и переприменить эти настройки - вариантов здесь куча: события, поведенческие паттерны я-ля observer, итп. Переприменение настроек - это тоже отдельная песня: поскольку у вас там WCF-репозиторий, то одно дело тупо сменить в нем строку подключения, и на этом всё, другое - после смены этой строки корректно завершить текущий сеанс, открыть новый, с новыми параметрами коннекта, и проч.
sheich
Member
Автор темы
2/384 ответов
20 лет на iXBT, с сентября 2004
Чаще пишет в "Игры" (49%)
Инфо Ответить
s
sheich Member Автор темы
9 лет назад / 28 сентября 2016 13:06
Konstantin Mironovich:
а что хочется сделать? чисто идеологически, без привязки к конкретной реализации.
хочется, обновив config файл приложения (app.exe.config и есть еще пара спец xml-конфигов) некой командой (вызов спец метода веб сервиса) заставить сервис не просто перечитать эти конфиги, но начиная с этого момента использовать обновленные параметры для будущих операций
ну, в конфиге лежит какой нить путь к БД, например, или ключ-строка для шифрования данных. вот, мы их хотим менять на-лету. но наше приложение читает конфиги при старте и дальше использует указанные в конфигах параметры (конкретно они назначаются через Bind, описанные в DI-модулях). то есть, приложение не читает конфиг каждый раз (с диска) перед тем, как выполнить какую то операцию. понятно, что можно просто каждый раз при выполнении операции читать файл и брать из него текущие значения. но это плохо, т.к. медленно и т.п.
вобщем, это не я придумал, но есть такая задача)

Добавление от 28.09.2016 13:10:

ash of mind:
sheich
повторный биндинг будет равносилен новому инстанциированию классов с внедренными зависимостями, что, по поему скромному, мало отличается от рестарта сервиса.
ну, вот это я уже понял. я могу в методе сервиса создать новый инстанс с измененными параметрами с помощью .Rebind
ж..а в том, что это каждый раз именно новый инстанс. потому что потом, когда я следующим шагом вызываю уже стандартные операции, сервис использует первый инстанс, созданный при старте со всеми внедренными на тот момент зависимостями (аргументами)
ash of mind
Member
1380/4861 ответов, #10 в рейтинге
17 лет на iXBT, с июля 2007
1 фото на iXBT.photo
Чаще пишет в "Программирование" (30%)
Инфо Ответить
a
ash of mind Member
9 лет назад / 28 сентября 2016 15:36
sheich
ж..а в том
что вы почему-то зациклилилсь на этом Ninject. Его вообще могло не быть, не быть никаких инжекций зависимостей, и в классах внутри сами бы инстанциировались вполне конкретные реализации сервисов (DI обычно инженктит абстрактные классы/интерфейсы) - от этого бы вообще ничего не изменилось. Вам нужно переписывать логику самого приложения для подхватывания измененных параметров конфигурации на лету, а уж как там связаны классы внутри приложения - жестко, или через DI - в контексте этой темы дело совсем пятое.
Konstantin Mironovich
Expert
4762/26495 ответов
25 лет на iXBT, с ноября 1999
Чаще пишет в "Политика" (35%)
Инфо Ответить
K
Konstantin Mironovich Expert
9 лет назад / 28 сентября 2016 19:12
sheich
ж..а в том, что это каждый раз именно новый инстанс.
это не ж..а, это так и должно быть.
не надо создавать сервис. надо обратиться к уже запущенному.
пару способов я указал. первый довольно оригинальный, но требует исследования (применительно к WCF). второй общепрактикуемый. можно обойтись одной трубой, по которой запускать разные команды и даже сообщения. пользуясь, к примеру, google protocol buffers. а можно создать несколько труб по одной на каждую команду (годится для школьного примера). еще можно через shared memory (но трубы на одном компе так и общаются).
главное тут, как я понимаю, в "graceful reconnection". на что и обращает внимание ash of mind.
sheich
Member
Автор темы
3/385 ответов
20 лет на iXBT, с сентября 2004
Чаще пишет в "Игры" (49%)
Инфо Ответить
s
sheich Member Автор темы
9 лет назад / 29 сентября 2016 18:12
Konstantin Mironovich:
не надо создавать сервис. надо обратиться к уже запущенному.
они в этих примерах описывают, как создать клиент-сервер для wcf-сервиса и обсуждают, как добавить net.pipe
так это несложно вроде
я не вижу там примеров, как находить инстанс сервиса и менять его свойства...
Konstantin Mironovich
Expert
4763/26510 ответов
25 лет на iXBT, с ноября 1999
Чаще пишет в "Политика" (35%)
Инфо Ответить
K
Konstantin Mironovich Expert
9 лет назад / 29 сентября 2016 20:35
sheich

сервис при старте создает named pipe и слушает ее (лучше в отдельном потоке). управляющая программа открывает pipe с точно таким же именем и посылает туда команду. сервис принимает команду, распознает ее и выполняет. все.
поскольку сервис и управляющая программа работают в разных сессиях, то имя трубы должно быть с префиксом global. типа "global\pipename". описано в msdn.
кроме того трубы можно создавать для работы в блочном режиме и в режиме сообщений. нужно последнее.
хотя может WCF делает все это автоматом. тут я не спец.
vertur
заблокирован в конференции до 20 апреля 2025, 17:01
4045/4560 ответов, #6 в рейтинге
17 лет на iXBT, с марта 2008
Чаще пишет в "Программирование" (52%)
Гондурас, MN = мразь
Инфо Ответить
v
vertur заблокирован в конференции до 20 апреля 2025, 17:01
9 лет назад / 01 октября 2016 20:50
Konstantin Mironovich

сервис при старте создает named pipe
TCP сокет лучше. Тогда управляющая программа может работать вообще на другой машине и... система с такой архитектурой может быть легче спортирована на другие платформы. Можно будет управлять вендосерфисом с "любимого айфончика" и, наоборот, управлять серьезным демоном с вендового офисного десктопа.
Konstantin Mironovich
Expert
4769/26530 ответов
25 лет на iXBT, с ноября 1999
Чаще пишет в "Политика" (35%)
Инфо Ответить
K
Konstantin Mironovich Expert
9 лет назад / 02 октября 2016 02:58
vertur
TCP сокет лучше.
для удаленных машин трубы работают через сокеты, для локальной - через shared memory.
vertur
заблокирован в конференции до 20 апреля 2025, 17:01
4061/4576 ответов, #6 в рейтинге
17 лет на iXBT, с марта 2008
Чаще пишет в "Программирование" (52%)
Гондурас, MN = мразь
Инфо Ответить
v
vertur заблокирован в конференции до 20 апреля 2025, 17:01
9 лет назад / 02 октября 2016 02:59
Konstantin Mironovich
pipe через socket ? возможно я что-то не знаю
для локальной - через shared memory.
нет, это не так. для локальной машины пайпы работают как пайпы.

для удаленных машин пайпы вообще не работают никак - т.к. это сущность локальной машины.

Исправлено: vertur, 02.10.2016 03:02

Konstantin Mironovich
Expert
4770/26531 ответов
25 лет на iXBT, с ноября 1999
Чаще пишет в "Политика" (35%)
Инфо Ответить
K
Konstantin Mironovich Expert
9 лет назад / 02 октября 2016 02:59
система с такой архитектурой может быть легче спортирована на другие платформы.
хотел бы я посмотреть как спортируют WCF сервис.
vertur
заблокирован в конференции до 20 апреля 2025, 17:01
4062/4577 ответов, #6 в рейтинге
17 лет на iXBT, с марта 2008
Чаще пишет в "Программирование" (52%)
Гондурас, MN = мразь
Инфо Ответить
v
vertur заблокирован в конференции до 20 апреля 2025, 17:01
9 лет назад / 02 октября 2016 03:01
Konstantin Mironovich

хотел бы я посмотреть как спортируют WCF сервис.
Об это даже и руки марать не стоит. сразу в топку.
Konstantin Mironovich
Expert
4771/26532 ответов
25 лет на iXBT, с ноября 1999
Чаще пишет в "Политика" (35%)
Инфо Ответить
K
Konstantin Mironovich Expert
9 лет назад / 02 октября 2016 03:21
vertur
pipe через socket ? возможно я что-то не знаю
строго говоря через RPC. но в конечном итоге через TCP.

сервер создает трубу с именем "\\\\.\\pipe\\mynamedpipe"
а вот клиент может быть удаленным.
в этом случае используется имя "\\\\servername\\pipe\\mynamedpipe", где используется имя удаленного сервера, создавшего трубу. вроде бы ip address в качестве имени годится.
лет 10 прошло как я этим занимался.

Добавление от 02.10.2016 03:26:

vertur
нет, это не так. для локальной машины пайпы работают как пайпы.

Pipes
A pipe is a section of shared memory that processes use for communication.
не помню где я все это читал про пайпы. а может на какой тусовке рассказывали. очень давно было дело..

Добавление от 02.10.2016 04:01:

Konstantin Mironovich
имя трубы должно быть с префиксом global. типа "global\pipename". описано в msdn.

вот тут я кажется маленько сбрехнул. перепутал с named shared memory. надо уточнить в доках.
звиняйте.
vertur
заблокирован в конференции до 20 апреля 2025, 17:01
4064/4579 ответов, #6 в рейтинге
17 лет на iXBT, с марта 2008
Чаще пишет в "Программирование" (52%)
Гондурас, MN = мразь
Инфо Ответить
v
vertur заблокирован в конференции до 20 апреля 2025, 17:01
9 лет назад / 02 октября 2016 09:29
Konstantin Mironovich

Pipes
Это только под вендой так - там не все как у людей. А так второе (неофицальное) название пайпов - это локальные сокеты.
a pipe, a unidirectional data channel that can be used for interprocess communication
ни о какой shared memory в принципе нет речи. Для использования shared memory есть.... shared memory.
вот тут я кажется маленько сбрехнул.
pipe может быть как именованым так и анонимным.
Ваш ответ:

Нет значка Нет значка Вот тут! Лампочка Восклицание Вопрос Класс! Улыбка Злость Огорчение Поговорим? Краснею Подмигивание Ругаю ОдобряюBIUdelSxsupxsuboffsp spoilerqurlimgvideo• list1. list1 codeprecenter-hr-rusQWE→ЙЦУ
файлыочистить
Ваше имя: Авторизуйтесь Предпросмотр В полную форму
вставить выделенную цитату в окно ответа
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Последние обсуждения в Конференции
05:39Отзывы о PrivalSystems (аналог skype) Интернет
05:38О выборе и использовании велосипеда для взрослых (без фетишизма и яспортсменства) Спорт
05:35Нужен мобильный кондиционер Бытовая техника
05:30Отечественные микропроцессоры. Состояние и перспективы Процессоры
05:24ОЗОН - как меня пытается обмануть российский универсальный интернет-магазин Рынок
05:24Обработка в AviSynth видео, полученного после оцифровки с VHS и других аналоговых кассет Видеозахват
05:23Поделитесь своим настроением. Какое оно у вас сейчас? Флуд
05:23Украина после Евромайдана, ситуация в регионе, влияние на Россию и мир: пророссийский взгляд Политика
05:15Слышите ли лично вы разницу между FLAC, MP3, DSD? Стерео
05:03Модем или роутер с поддержкой ручного ввода APN по вменяемой цене или перепрошить MF90+/MF910 Сети
04:46А ещё остался в продаже настоящий шоколад? Кулинария
04:34Выбор LCD телевизора ДК TV
04:24Выбор конфигурации от 1000 до 1500 долларов (Intel) Тех. поддержка
04:19А почему, собственно, ARM? Эл. устройства
04:07Замкнутая стационарная Вселенная с переменной кривизной Наука
04:07Анора / Anora (2024) — фильм года и еще 5 оскаров. За что? Кино
04:02Гомики, ЛГБТ и прочие психические и психологические отклонения в интимной сфере Семья
04:01Про кошек Общий
03:54Выбор материнской платы для Intel Core Ultra 200 Arrow Lake-S (LGA 1851) Сист. платы
03:38Выбор BD-R/RE болванок Оптич. носители
01:12В Белоруссии выпустили патрульный «Минск» — специальный мотоцикл для ГАИ
00:48Сегодня, 19 апреля, стартует серийное производство Lada Iskra. За неделю АвтоВАЗ собрал 10 предсерийных Lada Iskra SW Cross — их выставят в шоу-румах дилеров
23:11вчераПочти половина печатной платы этой Gigabyte RTX 5060 Ti попросту бесполезна. PNY выпустила карту, 40% платы полностью пусты
22:59вчераНедорогой iPhone 16e — рекордсмен по количеству компонентов собственной разработки Apple
22:31вчераПока Nvidia запрещают, Huawei анонсирует замену. Новый ИИ-процессор Ascend 920 AI призван конкурировать с Nvidia H20
22:08вчера500-долларовый Pixle 9a фотографирует лучше, чем Galaxy S25 Ultra. Таков вердикт DxOMark
21:56вчераВероятно, это ужасно шумная и горячая версия GeForce RTX 5090D. В Китае уже начали пересобирать такие карты на оригинальных платах и с «турбиной»
21:49вчераБесплатная прибавка производительности для владельцев GeForce RTX 50. Свежий драйвер повышает её на 3-6% как минимум в бенчмарках
21:36вчераГолос с неба: DJI создала дрон-динамик громкостью с реактивный самолет и дрон с прожектором на 500 метров
21:26вчераЛаборатория вместо гигантских комплексов и 100 импульсов в секунду: лазер KALDERA преодолел главное препятствие плазменного ускорителя