Что такое прокси-объект .NET в смысле инверсии управления / аспектно-ориентированного?

StackOverflow https://stackoverflow.com/questions/287479

Вопрос

Что такое прокси-объект в инверсии управления / аспектно-ориентированном смысле?

Есть ли хорошие статьи о том, что такое прокси-объект?
Почему вы хотели бы использовать один?
А как написать один в C #?

Это было полезно?

Решение

В общем, объект Proxy - это объект (экземпляр класса), который предоставляет тот же общедоступный интерфейс, что и "реальный класс". но просто перенаправляет все звонки, сделанные его членам, в другой реальный класс. Прокси-объекты используются по разным причинам ...

Одной из целей является "притворство" быть реальным классом, чтобы клиентский компонент (или объект) мог "верить" он говорит с «реальным» объект, но внутри прокси-сервера, другие вещи (такие как ведение журнала, поддержка транзакций и т. д.) выполняются одновременно ... Во-вторых, прокси может быть очень дешевым по сравнению с реальным объектом. и часто используется, чтобы реальные объекты могли быть сохранены (выключены или выпущены в пул для использования другими клиентами), когда клиент их не использует ... Прокси остается "живым" и клиент думает, что он все еще имеет связь с реальным объектом, но всякий раз, когда он "вызывает" объект, он на самом деле вызывает прокси, который отправляет и получает другой реальный объект только для обработки вызова, а затем освобождает реальный объект после завершения вызова.

Относительно инверсии управления (IOC). Это относится к общему шаблону (также называемому «инъекция зависимостей»), в котором зависимые объекты внутри класса «вводятся». в экземпляр класса, из клиентского кода, чтобы контролировать, какую версию зависимого объекта будет использовать экземпляр ... IOC можно использовать для добавления " Proxy " объект в класс, где он думает, что использует реальный объект ... Фраза Inversion of Control относится к тому факту, что при использовании этого шаблона решение о том, какая именно реализация вызывается, больше не принимается. под контролем класса, выполняющего вызов, но клиенту этого класса, когда он внедряет экземпляр зависимого объекта в класс, который будет использоваться для этого вызова.

Обычно термин IOC используется с так называемым контейнером IOC , который является классом, специально предназначенным для того, чтобы отвечать за создание экземпляров зависимых классов на основе слабосвязанной информации об этих классах (типы). который он получает из какого-то другого источника, кроме аппаратных зависимостей (чаще всего из какого-то файла конфигурации). Как правило, когда вы используете контейнер IOC, вы создаете его экземпляр при запуске приложения, а затем (читая данные конфигурации или что-то еще), вы " зарегистрируйтесь " каждый из классов (типов), за которые будет отвечать контейнер IOC, со значением ключа. Ключом часто является абстрактный тип или интерфейс, который должны реализовывать все экземпляры этой регистрации). Затем в обычных операциях вашего приложения, где в противном случае вы могли бы создать новый экземпляр экземпляра одного из этих типов, вы вызываете контейнер IOC и вместо этого запрашиваете его экземпляр, используя абстрактный тип / интерфейс в качестве ключа. , Контейнер IOC затем использует отражение или динамическую загрузку (или что-то еще), чтобы создать экземпляр любого типа, который был «зарегистрирован». с этим ключом. Таким образом, просто изменяя данные конфигурации, вы можете контролировать фактические типы, используемые приложением, изменяя их в одной среде или в месте развертывания по сравнению с теми, которые используются в другой.

Другие советы

Очень хороший ресурс об этом - старая «Банда четырех» дизайн шаблонов книги. Эта книга очень полезна для всех, кто разрабатывает объектно-ориентированное программное обеспечение. Я лично использую прокси-объекты для отложенной загрузки с помощью NHibernate. Я не использую прокси с инверсией управления, потому что разрешаю интерфейсные типы только с помощью IoC.

Объяснение Чарльза Бретаны очень хорошее.

Я не могу представить связь между прокси и AoP. Может ли кто-нибудь объяснить это здесь?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top