У меня есть приложение, которое должно иметь несколько доменов приложений для изоляции потенциально небезопасных модулей, а также обеспечивать уровень изоляции для небезопасного для потоков кода. Каждый модуль реализует общий интерфейс, но также включает долговременные вызовы методов (минуты).
В далеком прошлом, когда я делал что-то подобное, я использовал MarshalByRefObject
, но с тех пор, как прочитал, что WCF теперь является предпочтительным механизм взаимодействия через границу домена приложений.
Поскольку мне нужно несколько доменов приложений и каждый запрос может быть долгоживущим, я вижу несколько проблем:
- Мне явно нужен только один поток для выполнения «рабочего» кода в заданное время (поэтому подход WCF по умолчанию для создания экземпляра нового класса хоста для каждого запроса является проблемой)
- Как управлять списком доменов приложений / соответствующих конечных точек для выполнения вызовов (как сообщить каждому AD, какую конечную точку использовать / как он должен сообщать конечную точку, которую он выбирает наугад)
Изначально я планировал сделать вызовы в AppDomain асинхронными и иметь внутреннюю систему очередей, которая позволяла мне отслеживать / извлекать результаты, но в свете использования WCF и проблем с переопределением, достаточных для управления созданием экземпляра объекта хоста службы ( чтобы разрешить последующие вызовы одного и того же объекта), я начинаю задаваться вопросом, должен ли я блокировать все вызовы и позволять родительскому процессу обрабатывать все проблемы с потоками. конечно, тогда мне также нужно было бы убедиться, что у меня никогда не было больше одного ожидающего вызова для данного домена приложения, и выполнить постановку в очередь в родительском процессе.
Есть ли у кого-нибудь опыт работы с подобным сценарием / советом по хорошей архитектуре / ссылкой на достойную статью?
MarshalByRefObject
и посмотреть, как получится. Между прочим, если вы хотите написать в качестве ответа, я приму, если у меня не будет лучшей альтернативы. - person Basic   schedule 21.08.2012