2012-04-04 4 views
5

Мне было интересно, есть ли поддержка AOP (Aspect Oriented Programming) вместе с MonoTouch (и тем самым с MonoDevelop).AOP с MonoTouch

До сих пор мне не удалось найти инструменты, поддерживающие MonoDevelop. Насколько я вижу, такие инструменты, как PostSharp, не поддерживаются.

ответ

3

Я смог получить PostSharp, работающий над Mono для Android (с Visual Studio). Я не использовал MonoTouch, но вы можете дать ему попробовать в любом случае: http://mgroves.com/monodroid-with-postsharp/

+1

Это потому, что вы можете использовать DLL Silverlight; Я (думаю) не могу ссылаться на эту DLL в MonoDevelop в проекте Monotouch. –

2

Инструменты, которые не зависят от динамической генерации кода должен работать с MonoTouch. IIRC PostSharp - такой инструмент, то есть он модифицирует IL для получения результатов.

Причина, по которой это более ограничительно для MonoTouch (чем другие платформы .NET, включая Mono для Android), заключается в том, что iOS не позволяет генерировать код, поэтому мы не можем JIT на устройствах. Это означает, что все приложения MonoTouch должны быть скомпилированы AOT (раньше времени).

Обратите внимание, что инструмент может Работа не означает, что он будет работать. Например. инструменты должны быть выполнены на OSX, и вам необходимо интегрировать их в сборку (после компиляции C#, но до компиляции AOT). Позднее может потребоваться использование скриптов/Makefile для создания вашего проекта.

2

Я недавно создал Fody addin под названием StaticProxy.Fody, который компилирует время перехватывания кода перехвата в класс и также может автоматически реализовать интерфейсы. Это более или менее то, что обеспечивает, например, замок динамического прокси-интерфейса «прокси-сервер без цели» и «интерфейс-прокси с целью» и «класс-прокси». Обратите внимание, что он ограничен тем, что вам нужно отметить интерфейсы/классы, которые должны быть сотканы атрибутом [StaticProxy]. Таким образом, вы можете только перехватывать типы, где вы можете добавить это (==> источник под вашим контролем).

Кроме того, поскольку он добавляет аргумент конструктора, использование контейнера инъекции зависимостей в основном является обязательным (он прерывает «новые вызовы Foo (..)»). Я уже создал расширение для Ninject и единства:

NuGet пакетов доступны и я бы очень приветствовать, если кто-то может проверить интеграцию MonoTouch/MonoDroid. Я боюсь, что в настоящее время я неправильно создаю пакет nuget.

Я также планирую добавлять автоматические заводские реализации (например, привязку ninject «.ToFactory()»).