Хотелось бы такого — чтобы можно было передать в чужой код ссылку на объект, и любая попытка его изменения приводила бы к исключению. Точнее, там не один объект, а сложная система из объектов с перекрестными ссылками. То есть нужно, чтобы блокировались вызовы методов, которые изменяют состояние.
Насколько я понимаю, в CLI вполне возможно добиться такого, с помощью перехвата вызовов например.
Где-нибудь есть готовые реализации?
Здравствуйте, Torie, Вы писали:
T>Хотелось бы такого — чтобы можно было передать в чужой код ссылку на объект, и любая попытка его изменения приводила бы к исключению. Точнее, там не один объект, а сложная система из объектов с перекрестными ссылками. То есть нужно, чтобы блокировались вызовы методов, которые изменяют состояние.
А зачем предоставлять чужому коду доступ к методам, изменяющим состояние?
Здравствуйте, Aen Sidhe, Вы писали:
AS>А зачем предоставлять чужому коду доступ к методам, изменяющим состояние?
Ну так для моего кода такой доступ нужен. То есть придется делать по две версии каждого интерфейса, а там еще и коллекции BCL, и коллекции интерфейсов, и вложенные объекты, и наследование.. В общем, это гемор фантастических масштабов. Я например работал с Microsoft.CCI, там разработчики пошли именно по этому пути. Скажу прямо — это чудовищно, до сих пор снятся в страшных снах все эти прыжки с бубном
Хочется добиться аналогичного результата, но без кучи ручной работы.
Здравствуйте, Torie, Вы писали:
T>Здравствуйте, Aen Sidhe, Вы писали:
AS>>А зачем предоставлять чужому коду доступ к методам, изменяющим состояние?
T>Ну так для моего кода такой доступ нужен. То есть придется делать по две версии каждого интерфейса, а там еще и коллекции BCL, и коллекции интерфейсов, и вложенные объекты, и наследование.. В общем, это гемор фантастических масштабов. Я например работал с Microsoft.CCI, там разработчики пошли именно по этому пути. Скажу прямо — это чудовищно, до сих пор снятся в страшных снах все эти прыжки с бубном T>Хочется добиться аналогичного результата, но без кучи ручной работы.
Здравствуйте, Torie, Вы писали:
T>Хотелось бы такого — чтобы можно было передать в чужой код ссылку на объект, и любая попытка его изменения приводила бы к исключению. Точнее, там не один объект, а сложная система из объектов с перекрестными ссылками. То есть нужно, чтобы блокировались вызовы методов, которые изменяют состояние. T>Насколько я понимаю, в CLI вполне возможно добиться такого, с помощью перехвата вызовов например. T>Где-нибудь есть готовые реализации?
"Чужой код" обычно ожидает некий интерфейс (не в смысле C# interface, а в общем смысле) через который с объектом и работает. Например, "чужому коду" который занимается сортировкой требуется передать массив данных. Какой смысл запрещать этому коду изменять содержимое массива?
Если "чужой код" требует такой интерфейс, через который объект можно изменить, то значит или "чужому коду" действительно требуется изменить объект и не понятно, зачем и как (исключением? игнорированием?) изменение запретить, или же "чужой код" не будет изменять объект и тогда беспокоиться незачем.
Может быть, у вас другая задача — не "передать в чужой код ссылку на объект", а предоставить такой интерфейс своих объектов, через который нельзя было бы объекты изменить?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Может быть, у вас другая задача — не "передать в чужой код ссылку на объект", а предоставить такой интерфейс своих объектов, через который нельзя было бы объекты изменить?
У меня этих интерфейсов десятки, они все связаны и образуют сложную объектную модель. Ты представляешь себе объем гемора, если я буду отграничивать доступ вручную?
Здравствуйте, Torie, Вы писали:
T>Здравствуйте, _FRED_, Вы писали:
_FR>>Может быть, у вас другая задача — не "передать в чужой код ссылку на объект", а предоставить такой интерфейс своих объектов, через который нельзя было бы объекты изменить?
T>У меня этих интерфейсов десятки, они все связаны и образуют сложную объектную модель. Ты представляешь себе объем гемора, если я буду отграничивать доступ вручную?
Могу предложить рантаймовый AOP типа Unity с Interception. Просто атрибутами навесить обработчики на методы, которые нельзя вызывать и отдавать прокси стороннему коду.
Здравствуйте, Torie, Вы писали:
_FR>>Может быть, у вас другая задача — не "передать в чужой код ссылку на объект", а предоставить такой интерфейс своих объектов, через который нельзя было бы объекты изменить?
T>У меня этих интерфейсов десятки, они все связаны и образуют сложную объектную модель. Ты представляешь себе объем гемора, если я буду отграничивать доступ вручную?
Не представляю, так как не понимаю, что требуется Сначала давайте посмотрим на то, что нужно, а потом уже будем представлять, на сколько это сложно Так что же всё-таки требуется? может, пример можно привести?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, gandjustas, Вы писали:
G>Могу предложить рантаймовый AOP типа Unity с Interception. Просто атрибутами навесить обработчики на методы, которые нельзя вызывать и отдавать прокси стороннему коду.
А можно сделать, чтобы прокси автоматически навешивались на все ссылки, которые чужой код получит от моего исходного прокси?
Здравствуйте, _FRED_, Вы писали:
_FR>Не представляю, так как не понимаю, что требуется Сначала давайте посмотрим на то, что нужно, а потом уже будем представлять, на сколько это сложно Так что же всё-таки требуется? может, пример можно привести?
Посмотри на объектную модель Microsoft.CCI, там хороший пример во что выливаются попытки сделать, как предлагаешь ты
Здравствуйте, Torie, Вы писали:
_FR>>Не представляю, так как не понимаю, что требуется Сначала давайте посмотрим на то, что нужно, а потом уже будем представлять, на сколько это сложно Так что же всё-таки требуется? может, пример можно привести?
T>Посмотри на объектную модель Microsoft.CCI, там хороший пример во что выливаются попытки сделать, как предлагаешь ты
Во-первых, почему я должен на что-то смотреть? Я попросил лишь внятно и понятно сфорсмулировать вопрос. Или это такой вопрос: мне нужно тоже что там, но е так? Так вопросы не задают.
Во-вторых, я ещё ничего предложить не успел, кроме как объяснить мне свои желания. Не хочется — не надо.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Torie, Вы писали:
T>Здравствуйте, gandjustas, Вы писали:
G>>Могу предложить рантаймовый AOP типа Unity с Interception. Просто атрибутами навесить обработчики на методы, которые нельзя вызывать и отдавать прокси стороннему коду.
T>А можно сделать, чтобы прокси автоматически навешивались на все ссылки, которые чужой код получит от моего исходного прокси?
Здравствуйте, Torie, Вы писали:
_FR>>Во-первых, почему я должен на что-то смотреть? Я попросил лишь внятно и понятно сфорсмулировать вопрос.
T>Я сформулировал внятно и понятно — для тех, кто в теме. А если кто не в теме, то им я помочь не могу
Вовсе не обязательно при этом грубить тем, кто не понял. Ведь помощь-то нужна как раз вам.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Вовсе не обязательно при этом грубить тем, кто не понял. Ведь помощь-то нужна как раз вам.
Всегда удивляюсь с людей, которые не поняли сути вопроса, но рвутся обязательно что-нибудь написать.
Можно было просто промолчать — на вопрос или ответил бы кто-нибудь, кто понял, или автор уточнил бы вопрос
Здравствуйте, Torie, Вы писали:
_FR>>Вовсе не обязательно при этом грубить тем, кто не понял. Ведь помощь-то нужна как раз вам.
T>Всегда удивляюсь с людей, которые не поняли сути вопроса, но рвутся обязательно что-нибудь написать. T>Можно было просто промолчать — на вопрос или ответил бы кто-нибудь, кто понял, или автор уточнил бы вопрос
Здесь всё-таки форум и писать сюда у меня прав не меньше чем у вас. И вопросы по интересующей теме задавать я могу не меньше вашего. Мне стала интересна ваша ситуация и вот уж не ожидал, что получу такой ответ на своё любопытство. Очень жаль.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здесь всё-таки форум и писать сюда у меня прав не меньше чем у вас. И вопросы по интересующей теме задавать я могу не меньше вашего. Мне стала интересна ваша ситуация и вот уж не ожидал, что получу такой ответ на своё любопытство.
Я разве запрещаю? Просто удивляюсь с нелогичного поведения.
Вопрос тебе не понятен, смотреть ни на что ты не хочешь
Здравствуйте, Torie, Вы писали:
T>Хотелось бы такого — чтобы можно было передать в чужой код ссылку на объект, и любая попытка его изменения приводила бы к исключению. Точнее, там не один объект, а сложная система из объектов с перекрестными ссылками. То есть нужно, чтобы блокировались вызовы методов, которые изменяют состояние. T>Насколько я понимаю, в CLI вполне возможно добиться такого, с помощью перехвата вызовов например. T>Где-нибудь есть готовые реализации?
Можно попробовать разместить всю толпу объектов в отдельном контексте c помошью ContextBoundObject. При этом в .NET межконтекстные вызовы можно перехватывать.
Учтите только, что межконтекстные вызовы штука весьма тормознутая, и на межконтестные вызовы налагаются ограничения по JIT-оптимизации.