Здравствуйте, IT, Вы писали:
IT>Пробую реинкарнировать аспекты из BLToolkit и пока не вижу никаких принципиальных проблем.
Главная проблема — оно будет работать только на исходниках данного проекта. Если что-то где-то позовётся из либы — то там ты не сможешь что-либо перехватить. Ибо перехватывать надо то, что зовётся, а не там откуда зовётся.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
IT>>Пробую реинкарнировать аспекты из BLToolkit и пока не вижу никаких принципиальных проблем. ·>Главная проблема — оно будет работать только на исходниках данного проекта. Если что-то где-то позовётся из либы — то там ты не сможешь что-либо перехватить. Ибо перехватывать надо то, что зовётся, а не там откуда зовётся.
Т.е. тебя интересует следущий сценарий:
Есть некая библиотека, например System.Core. Ребята из MS в ней чего-то там понаписали, но тебя это не устраиват и ты хочешь у них там внутри что-нибудь перехватить и подменить на свой код. Правильно?
Честно говоря, никогда не интересовал такой сценарий. Да и звучит это весьма бредово. Не находишь? Это уже никакие не аспекты. Это уже больше из области хаккинга.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, ·, Вы писали:
S>>>> Суть можешь написать свой генератор, а логику замены в отдельном файле и класс расширения для замены S>>·>Круто, конечно, но ни для моков, ни для AOP оно не подходит. S>>Знакомство с АОП S>>Там и явовские @Aspect и используется в PostSharp ·>Причём тут InterceptsLocation?!
При том, что подмена идет не на уровне метода класса, а на подмене вызова этого метода.
Назови причины, почему нельзя подменить вызов страивая в метод дополнительные вызовы до и после заменяемого вызова?
S>> И они тоже заинтересованы в https://github.com/dotnet/csharplang/issues/7009?WT.mc_id=dotnet-35129-website&ysclid=lp6tob5u2o953641620#issuecomment-1479711571 ·>Ты, видимо, английский плохо понимаешь, но тут они прямым текстом говорят, что это для AOP не подходит и предлагают помочь provide a more elegant and robust solution.
Они говорят, что сейчас нужно больше функционала для подмены вызова.
Они сейчас правят IL код, а могут подменять вызов
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, ·, Вы писали:
IT>>Пробую реинкарнировать аспекты из BLToolkit и пока не вижу никаких принципиальных проблем. ·>Главная проблема — оно будет работать только на исходниках данного проекта. Если что-то где-то позовётся из либы — то там ты не сможешь что-либо перехватить. Ибо перехватывать надо то, что зовётся, а не там откуда зовётся.
Я тебе давал ссылку на PostSharp там редактируется IL код.
А вот подменить вызов аналогично AOT как раз нет проблем. Что то вызвать до и после вызова основного метода нет проблем.
В чем проблема?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, ·, Вы писали:
IT>>>Пробую реинкарнировать аспекты из BLToolkit и пока не вижу никаких принципиальных проблем. IT>·>Главная проблема — оно будет работать только на исходниках данного проекта. Если что-то где-то позовётся из либы — то там ты не сможешь что-либо перехватить. Ибо перехватывать надо то, что зовётся, а не там откуда зовётся. IT>Т.е. тебя интересует следущий сценарий:
Нет, конечно. Для АОП сценарий совсем другой. Есть какой-то фреймворк, написанный 3rd party, веб-сервер условный. Пишешь класс бизнес-логики, обвешиваешь аннотациями, например, Transactional и отдаёшь класс веб-серверу. Веб-сервер парсит запросы и дёргает методы. Обмазанные АОП методы должны делать что-то ещё, открывать-закрывать тразнакции например.
Притом, такие штуки имеют смысл в больших проектах, когда разные команды разрабатывают разные компоненты в разных сборках и их по всякому между собой комбинируют.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Serginio1, Вы писали:
S>·>Причём тут InterceptsLocation?! S> При том, что подмена идет не на уровне метода класса, а на подмене вызова этого метода.
Где идёт? Причём тут PostSharp?
S>Назови причины, почему нельзя подменить вызов страивая в метод дополнительные вызовы до и после заменяемого вызова?
Я уже отвечал на этот вопрос.
S>>> И они тоже заинтересованы в https://github.com/dotnet/csharplang/issues/7009?WT.mc_id=dotnet-35129-website&ysclid=lp6tob5u2o953641620#issuecomment-1479711571 S>·>Ты, видимо, английский плохо понимаешь, но тут они прямым текстом говорят, что это для AOP не подходит и предлагают помочь provide a more elegant and robust solution. S> Они говорят, что сейчас нужно больше функционала для подмены вызова.
Они это не говорят. Они говорят, что подход надо менять. "worth considering a more general and flexible approach"
S> Они сейчас правят IL код, а могут подменять вызов
Откуда ты это взял? Они планируют добавить "call-site aspects" в свою либу, как дополнительную фичу.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Serginio1, Вы писали:
S>·>Главная проблема — оно будет работать только на исходниках данного проекта. Если что-то где-то позовётся из либы — то там ты не сможешь что-либо перехватить. Ибо перехватывать надо то, что зовётся, а не там откуда зовётся. S> Я тебе давал ссылку на PostSharp там редактируется IL код. S> А вот подменить вызов аналогично AOT как раз нет проблем. Что то вызвать до и после вызова основного метода нет проблем. S>В чем проблема?
Я уже несколько раз отвечал на этот вопрос — call sites не всегда доступны, тем более в виде исходников конкретно на шарпе и конкретно в текущем проекте. При модификации IL-кода, как в PostSharp, таких ограничений нет.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
S>>·>Главная проблема — оно будет работать только на исходниках данного проекта. Если что-то где-то позовётся из либы — то там ты не сможешь что-либо перехватить. Ибо перехватывать надо то, что зовётся, а не там откуда зовётся. S>> Я тебе давал ссылку на PostSharp там редактируется IL код. S>> А вот подменить вызов аналогично AOT как раз нет проблем. Что то вызвать до и после вызова основного метода нет проблем. S>>В чем проблема? ·>Я уже несколько раз отвечал на этот вопрос — call sites не всегда доступны, тем более в виде исходников конкретно на шарпе и конкретно в текущем проекте. При модификации IL-кода, как в PostSharp, таких ограничений нет.
И это работает. Но утверждаешь, что не может работать!
Сам проверь. Единственно, что мне пришлось скопировать в папку с нугетами создать папку AspectGenerator и скопировать в неё
AspectGenerator.0.0.2-preview.nupkg и netstandard2.0
и солнце б утром не вставало, когда бы не было меня
S>> Я тебе давал ссылку на PostSharp там редактируется IL код. S>> А вот подменить вызов аналогично AOT как раз нет проблем. Что то вызвать до и после вызова основного метода нет проблем. S>>В чем проблема? ·>Я уже несколько раз отвечал на этот вопрос — call sites не всегда доступны, тем более в виде исходников конкретно на шарпе и конкретно в текущем проекте. При модификации IL-кода, как в PostSharp, таких ограничений нет.
Я еще на луну нельзя улететь.
InterceptsLocation нужны для замены вызовов в своем коде. А тебя несет, туда для чего InterceptsLocation не предназначен.
Не хочешь не пользуйся. Пользуйся PostSharp.
В чем проблемы. Но сам обертки ты написать не можешь. То есть ограничен функциональностью PostSharp.
В отличие от PostSharp с помощью InterceptsLocation ты сам можешь генерировать вызовы для более детальной отладки и прочее.
При этом ты легко все возвращаешь на место без использования InterceptsLocation.
Вещь крутая и нужная.
и солнце б утром не вставало, когда бы не было меня
public void PrintColour(Colour colour)
{
Console.WriteLine("You chose " + colour.ToString()); // типа здесь call site подменяется ToString на ToStringFast. Круто...
}
... но это бесполезный пример, игрушечный. Да и вообще, ведь это твой код, проще сразу писать Console.WriteLine("You chose " + colour.ToStringFast()), зачем эта вся котовасия вообще неясно.
В реальном коде будет
public void PrintColours(List<Colour> colours)
{
Logger.Info("You chose {colours}", colours); // и что здесь подменять?!
}
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Serginio1, Вы писали:
S> И это работает. Но утверждаешь, что не может работать!
Я с этим и не спорил. Мой тезис в том, что это негде применить с пользой. Это кривое решение несуществующей проблемы.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
S>> И это работает. Но утверждаешь, что не может работать! ·>Я с этим и не спорил. Мой тезис в том, что это негде применить с пользой. Это кривое решение несуществующей проблемы.
Я с тебя хренею. Ты говорил про то, что нельзя использовать AOP.
Тебе привели пример где этот AOP используется. Но ты все равно говоришь, что применить нельзя.
Странный ты конечно. Реально подмена кода нужна как при отладке (добавляя дополнительную информацию вызова метода), которая не нужна в релизе.
Да приходится воротить условную компиляцию. Но проще написать алгоритм подмены с нужным функционалом и проблем нет.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Я еще на луну нельзя улететь. S> InterceptsLocation нужны для замены вызовов в своем коде. А тебя несет, туда для чего InterceptsLocation не предназначен.
Не меня несёт, а тебя. Ты стал доказывать, что это полезно для АОП. Для чего конкретно предназначен InterceptsLocation — я так и не понял.
S> Не хочешь не пользуйся. Пользуйся PostSharp.
Проблема не в желании, а в возможности. Нельзя InterceptsLocation для АОП, как бы тебе это бы ни хотелось.
S> В чем проблемы. Но сам обертки ты написать не можешь. То есть ограничен функциональностью PostSharp. S> В отличие от PostSharp с помощью InterceptsLocation ты сам можешь генерировать вызовы для более детальной отладки и прочее.
Эту проблему решили создатели давно существующих AOP-библиотек, без всякого InterceptsLocation.
S>При этом ты легко все возвращаешь на место без использования InterceptsLocation. S> Вещь крутая и нужная.
Осталось придумать для чего.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Serginio1, Вы писали:
S>·>Я с этим и не спорил. Мой тезис в том, что это негде применить с пользой. Это кривое решение несуществующей проблемы. S>Я с тебя хренею. Ты говорил про то, что нельзя использовать AOP.
Ты мне льстишь, не я говорил, а разработчики АОП-библиотек. Я лишь для тебя перевёл на русский.
S>Тебе привели пример где этот AOP используется. Но ты все равно говоришь, что применить нельзя.
Мда? И кто этот АОП использует, где, и для чего?
S>Странный ты конечно. Реально подмена кода нужна как при отладке (добавляя дополнительную информацию вызова метода), которая не нужна в релизе. S>Да приходится воротить условную компиляцию. Но проще написать алгоритм подмены с нужным функционалом и проблем нет.
Эту проблему решили библиотеки логгирования. Уже много лет как.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Serginio1, Вы писали:
S>> Я еще на луну нельзя улететь. S>> InterceptsLocation нужны для замены вызовов в своем коде. А тебя несет, туда для чего InterceptsLocation не предназначен. ·>Не меня несёт, а тебя. Ты стал доказывать, что это полезно для АОП. Для чего конкретно предназначен InterceptsLocation — я так и не понял.
S>> Не хочешь не пользуйся. Пользуйся PostSharp. ·>Проблема не в желании, а в возможности. Нельзя InterceptsLocation для АОП, как бы тебе это бы ни хотелось.
Ну вот тебе дали пример! Но ты даже этот пример не хочешь посмотреть! S>> В чем проблемы. Но сам обертки ты написать не можешь. То есть ограничен функциональностью PostSharp. S>> В отличие от PostSharp с помощью InterceptsLocation ты сам можешь генерировать вызовы для более детальной отладки и прочее. ·>Эту проблему решили создатели давно существующих AOP-библиотек, без всякого InterceptsLocation.
А мне не нужны сторонние библиотеки. Как я сделаю подмену не своего кода? IL править? S>>При этом ты легко все возвращаешь на место без использования InterceptsLocation. S>> Вещь крутая и нужная. ·>Осталось придумать для чего.
Тебе дали пример! Придумывать нечего. Оно работает именно как AOP
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Serginio1, Вы писали:
S>>·>Я с этим и не спорил. Мой тезис в том, что это негде применить с пользой. Это кривое решение несуществующей проблемы. S>>Я с тебя хренею. Ты говорил про то, что нельзя использовать AOP. ·>Ты мне льстишь, не я говорил, а разработчики АОП-библиотек. Я лишь для тебя перевёл на русский.
Уги и как я без изменения IL сделаю сою обертку над методом?
S>>Тебе привели пример где этот AOP используется. Но ты все равно говоришь, что применить нельзя. ·>Мда? И кто этот АОП использует, где, и для чего?
То есть код ты не смотрел?
S>>Странный ты конечно. Реально подмена кода нужна как при отладке (добавляя дополнительную информацию вызова метода), которая не нужна в релизе. S>>Да приходится воротить условную компиляцию. Но проще написать алгоритм подмены с нужным функционалом и проблем нет. ·>Эту проблему решили библиотеки логгирования. Уже много лет как.
IL код?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Ну вот тебе дали пример! Но ты даже этот пример не хочешь посмотреть!
Я посмотрел и объяснил почему он не применим для АОП.
S>·>Эту проблему решили создатели давно существующих AOP-библиотек, без всякого InterceptsLocation. S> А мне не нужны сторонние библиотеки. Как я сделаю подмену не своего кода? IL править?
Господи. Непробиваемое мракобесие. Ты вообще читаешь что тебе пишут?
Повторяюсь. Для АОП не надо подменять не свой код. Надо делать подмену в своём коде, который может вызываться из чужого. Т.е. для АОП нужно не call site подменять, а делать замены в самом вызываемом коде. Нужно внедрять код _внутрь_ своих методов, а не в места их вызовов.
Разберись как PostSharp работает, например, что такое Compile Time Weaving.
S> Тебе дали пример! Придумывать нечего. Оно работает именно как AOP
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Serginio1, Вы писали:
S>·>Ты мне льстишь, не я говорил, а разработчики АОП-библиотек. Я лишь для тебя перевёл на русский. S> Уги и как я без изменения IL сделаю сою обертку над методом?
Ну погляди как разработчики АОП-библиотек это делают.
S>>>Тебе привели пример где этот AOP используется. Но ты все равно говоришь, что применить нельзя. S>·>Мда? И кто этот АОП использует, где, и для чего? S> То есть код ты не смотрел?
Смотрел.
S>·>Эту проблему решили библиотеки логгирования. Уже много лет как. S> IL код?
Нет. Погляди как устроены библиотеки логгирования.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Serginio1, Вы писали:
S>> Ну вот тебе дали пример! Но ты даже этот пример не хочешь посмотреть! ·>Я посмотрел и объяснил почему он не применим для АОП.
S>>·>Эту проблему решили создатели давно существующих AOP-библиотек, без всякого InterceptsLocation. S>> А мне не нужны сторонние библиотеки. Как я сделаю подмену не своего кода? IL править? ·>Господи. Непробиваемое мракобесие. Ты вообще читаешь что тебе пишут? ·>Повторяюсь. Для АОП не надо подменять не свой код. Надо делать подмену в своём коде, который может вызываться из чужого. Т.е. для АОП нужно не call site подменять, а делать замены в самом вызываемом коде. Нужно внедрять код _внутрь_ своих методов, а не в места их вызовов. ·>Разберись как PostSharp работает, например, что такое Compile Time Weaving.
Идет подмена ил кода. Но мне надо подменить свой код. Нахрена мне чужой?
Я тебе ссылки приводил, где редактируются методы класса, но замена вызова этого метода по сути однозначна.
Я только не могу напрямую использовать непубличные поля. Но и это не проблема. S>> Тебе дали пример! Придумывать нечего. Оно работает именно как AOP ·>
Да да
и солнце б утром не вставало, когда бы не было меня