Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Fody и его плагины

Anna | 17.06.2014 | нет комментариев
С выходом Roslyn разговоры о том, что скоро кода дозволено писать будет поменьше запылали с новой силой. Сегодня я расскажу немножко о ином подходе как писать поменьше кода и соответственно делать поменьше ошибок — расскажу о Fody. На прогре припоминание нашёл только мимоходом в рамках решения како-то задачи. Для того, Дабы заинтересовать читателя, ещё не решившего стоит ли тратить своё время на данный текст подмечу, что знаменитый NotifyPropertyWeaver переехал на Fody и с поддержкой Fody дозволено делать каждые там изумительные AOP.

Выходит, Fody — инструмент для постобработки .net сборок с целью внедрения в них своего IL кода через Cecil.Emit. Fody представляет из себя msbuild таску которая имеет конфигурационный файл в всяком из планов, для которых будет запущена. Вот такая строка будет добавлена в всякий ProjectName.project файл

<Import Project="Fody.targets" /> 

Всю работу по внедрению IL делают Fody плагины, перечисленные в конфигурационном файле.

<?xml version="1.0" encoding="utf-8" ?> 
<Weavers> 
  <SuperPluginName /> 
</Weavers> 

Максимально ничего не делающий плагин дозволено себе представить, как:

public class ModuleWeaver { 
    // Дозволено писать в MSBuildLog 
    public Action<string> LogInfo { get; set; } 
    // Экземпляр Mono.Cecil.ModuleDefinition для нынешней сборки 
    public ModuleDefinition ModuleDefinition { get; set; } 
    public void Execute() {   } 
} 

Если появляется вопрос для чего Fody вообще необходим, то скажу лишь что это дюже комфортно. Он инсталлируется через nuget и написав свой плагин дозволено легко указать его как связанность. Основное осознать, как Fody будет искать данный плагин и сделать верную конструкцию файлов и папок в packages и всё — вы теснее переписываете IL в своих сборках like a boss.

Плагины

Сам по себе fody не имеет большого смысла, следственно представляю обзор комплекта плагинов с официального сайта github.com/Fody/Fody. Изложение всякого плагина дюже короткое, но я верю довольное Дабы принять решение стоит ли тратить время на чтение документации. Верю будет пригодно. У себя в блоге (alexeysuvorov.com) я разбил плагины по категориям полезные/бесполезные*, но здесь я себе такого не разрешаю, так что всё списком по алфавиту:

Anotar
https://github.com/Fody/Anotar
Заменяет вызов одного способа на создание/резольвинг логгера и его вызов. Имеет несколько встроенных интеграций с основными логгинг системами. Полезность подозрительна, но здесь на вкус и цвет.

AssertMessage
https://github.com/Fody/AssertMessage

Assert.AreEqual(expectedCustomer.Money, actualCustomer.Money); // => 
Assert.AreEqual(expectedCustomer.Money, actualCustomer.Money, "Assert.AreEqual(expectedCustomer.Money, actualCustomer.Money);"); 

Отчего бы и нет. Если Вы пользуетесь Assert — ами и не вопреки подождать несколько лишних секунд при билде пока данный плагин дописывает за Вас строчки.

AsyncErrorHandler
https://github.com/Fody/AsyncErrorHandler
Заключает async в try-catch блок в котором исполняет
AsyncErrorHandler.HandleException(exception);
Мы не пользуемся, но выглядит пленительно, один из кандидатов на больше плотное тестирование и внедрение при необходимости.

Bix.Mixers
https://github.com/rileywhite/Bix.Mixers.Fody
Интеграция с BixMix. Сам BixMix схоже не так давным-давно стартанул и информации дюже немного, так что пожелаем парням везения и пойдём дальше.

Caseless
https://github.com/Fody/Caseless
Для строк заменяет == на string.Equals с соответствующим StringComparison. Дюже сомневаюсь что хочу Дабы за меня это делал IL инжектор.

Catel.Fody
https://github.com/Catel/Catel.Fody
Делает DependencyProperty из обыкновенных если класс унаследован от DataObjectBase либо ViewModelBase. Как я осознал Catel позиционирует себя как фреймворк для бизнеса поверх .net framework. Если пользуетесь Catel, то вероятно будет комфортно.

Commander.Fody
https://github.com/DamianReeves/Commander.Fody
Реализует ICommand для MVVM. В непонятном состоянии, документация не дописана.

Costura
https://github.com/Fody/Costura
Для фанатов ILMerge. Склеивает зависимые сборки в одну.

FodyDependencyInjection
https://github.com/jorgehmv/FodyDependencyInjection
Дюже необычный плагин. Резольвит зависимости из одного из 3-х IoC контейнеров Ninject, Autofac либо Spring.Net в свойства объектов минуя конструктор. Не стал разбираться что там и как внутри, потому что посыл первоначально неверный. Я считаю, что все зависимости обязаны быть объявлены как параметры конструктора, а напротив черт ногу сломит разбираться в коде.

EmptyConstructor
https://github.com/Fody/EmptyConstructor
Добавляет пустой конструктор к классу если он не определён. Подозрительно пригоден.

EmptyStringGuard
https://github.com/thirkcircus/EmptyStringGuard
Переписывает сеттеры и публичные способы принимающие строки, добавляет проверку на то, что строка не пустая. Если строка может быть пустая, то её дозволено пометить признаком AllowEmpty. Допустимо некоторые обнаружат пригодным, но меня огромнее тревожат null чем пустые строки.

EnableFaking.Fody
https://github.com/philippdolder/EnableFaking.Fody
Ещё один «антиплагин» (1-й был FodyDependencyInjection), каждому классам добавляет virtual для всех мемберов публичных классов (на самом деле там ряд условий). Предполагается что это комфортно для тестирования и перед продакшеном это необходимо выключать. Если необходимо применять данный плагин, значит с дизайном что-то не так.

Equals
https://github.com/Fody/Equals
Для помеченных объектов реализует способы Equals на основе свойств входящих в объект. Если у Вас куча DTO объектов и правила их сопоставления просто примитивны, то допустимо это то, что необходимо.

ExtraConstraints
https://github.com/Fody/ExtraConstraints
Разрешает задать delegate, enum и struct ограничения на тип параметр. C# не поддерживает такие ограничения, но в IL они абсолютно себе валидны. Допустимо появятся в следующих версиях С#stackoverflow.com/questions/1331739/enum-type-constraints-in-c-sharp/1331811#1331811.

Fielder
https://github.com/Fody/Fielder
Кровь кишки и расчленёнка — перефарширует все проеперти в филды. Самый безрассудный плагин по моему суждению.

Freezable
https://github.com/Fody/Freezable
Во все классы унаследованные от спец интерфейса IFreezable инжектится код, тот, что кидается исключениями на проперти сеттерах позже вызова способа Freeze. Мой проеденный f# с его immutability мозг не может себе представить сценарии когда это дозволено применять взамен объектов где readonly проперти задаются в конструкторе и не имеют свойств, но допустимо будет пригоден.

InfoOf 
https://github.com/Fody/InfoOf
Предоставляет methodof, propertyof и fieldof, но безусловно никакой магии и всё необходимо писать строками, которые потом перепишутся в соответствующие IL команды (да, methodof, propertyof и fieldof есть в IL). На любителя.

Ionad
https://github.com/Fody/Ionad
Заменяет все вызовы способов статических классов на Ваши имплементации с такими же сигнатурами. Вероятно, благотворно для тестинга, но Fake (прежний moles) делает всё отличнее.

Janitor
https://github.com/Fody/Janitor
Механически реализует IDisposable для всех классов унаследованных от IDisposable. Использует volatile int для определения что Dispose теснее был вызван. Если Вы разделяете взор автора плагина на то, как должен быть реализовал IDisposable, то это недурной плагин.

JetBrainsAnnotations
https://github.com/Fody/JetBrainsAnnotations
Jet Brains и здесь подсуетился, молодцы чё.

MethodCache
https://github.com/Dresel/MethodCache
Мемоизация способов помеченных аттрибутами. Реализация кеша оставлена нам, что безусловно радует. С удовольствием посмотрю поближе и потестирую если возникнет подходящая задача.

MethodDecorator
https://github.com/Fody/MethodDecorator
Декорирует способы помеченные признаками. Разрешает поймать момент входа в способ, выхода из него и эексепшен если произошёл. Обширно используем в плане, правда не подлинную, а мой форк, тот, что я допиливал под нужды плана и заодно заимплементил несколько пожеланий из обсуждения подлинного плагина. Может захватывать параметры передаваемые в способ. Я про него писал. Не стесняйтесь файлить в Issues на гитхабе, постараюсь оперативно фиксить/расширять при вероятности.

MethodTimer
https://github.com/Fody/MethodTimer
Облегчённая версия MethodDecorator, только меряет время которое заняло выполнение способа. Гадит в Debug либо в логгер, тот, что Вы ему предоставите. Допустимо пригоден, правда MethodDecorator на мой взор комфортнее.

Mixins.Fody 
https://bitbucket.org/skwasiborski/mixins.fody/wiki/Home
Множественное наследование через примеси. Альтернатива Castle’s dynamic proxy mixins. Я не поборник морали, так что абсолютно себе допускаю что возвращусь к этому плагину, как только .net загонит меня в надобность наследоваться и от класса Framework и от моего класса. Подлинно было такое один раз.

ModuleInit
https://github.com/Fody/ModuleInit
Собеседуя кандидатов я узнал для себя то, что не все .net программисты в курсе, что сборка содержит в себе модули. Это плагин разрешает задать конструктор для модуля. Для тех, кто понимает.

Mutable.Fody
https://github.com/ndamjan/Mutable.Fody
Антипод к Freeze. Делает иммутабельное мутабельным, правда теснее позже того как компилятор всё скомпилировал. Имеет толк если в F# необходимо десериализовать из XML, но Newton.Json теснее добавил типичную десериализцию для immutable f# типов, так что не вижу большого смысла, только если не legacy xml.

NullGuard
https://github.com/Fody/NullGuard
1-й в очереди на применение. Генерирует проверки на null если очевидно не указано что null допустим. По моему суждению такие вещи легко нужны в языках, допускающих null.

Obsolete
https://github.com/Fody/Obsolete
Разрешает применять Obsolete признак результативно. Дозволено задать версию с которой при обращении к Obsolete будут протекать ошибки компиляции и версию сборки начиная с которой она не скомпилируется с классом помеченным таким признаком. Дюже комфортно я думаю.

PropertyChanged
https://github.com/Fody/PropertyChanged
Прежний NotifyPropertyWeaver. Для тех, кто не знаком – данный плагин добавляет оповещение (вызов) PropertyChanged эвента для всех сеттеров пропертей объектов, унаследованных от INotifyPropertyChanged либо помеченных признаков. Абсолютно необходимая вещь если вы хоть раз пытались писать под WPF и его подмножества. Сурово рекомендую к применению если у вас есть UI на WPF.

PropertyChanging
https://github.com/Fody/PropertyChanging
Тоже самое, но для интерфейса INotifyPropertyChanging.

Publicize
https://github.com/Fody/Publicize
Делает приватные поля публичными «спрятанными». Мотивацию автор не стал уточнять, оставим это на его совести.

RemoveReference.Fody
https://github.com/icnocop/RemoveReference.Fody
Дозволено указать в признаке яруса сборки какие сборки вы хотите удалить из References позже билда. Насколько я осознал таким шаманством автор предлагает лечить вот данный багconnect.microsoft.com/VisualStudio/feedback/details/779370/vs2012-incorrectly-resolves-mscorlib-version-when-referencing-pcl-assembly. Он всё ещё открыт.

Resourcer 
https://github.com/Fody/Resourcer
Облегчает доступ к источникам сборки разрешая не писать AssemblyName. чудесный вариант для сборок с тестами. В очереди на использование в самое ближайшее время.

Scalpel
https://github.com/Fody/Scalpel
Вырезает тестовые способы и классы из сборок с кодом по конвеншену либо по признаку. Судя по каждому, Саймон (автор Fody и большинства плагинов) практикует тестирование «не отходя от кассы». Мне сложно представить мотивацию, но безусловно это не самый безрассудный плагин, правда уверенно входит в топ 5.

Stamp
https://github.com/Fody/Stamp
Добавляет в AssemblyVersionInformation хешик последнего git коммита. На вкус и цвет.

Stiletto
https://github.com/benjamin-bader/stiletto
Ещё один вариант IoC контейнера. Может похвастаться завидной всеядностью потому как работает там, где нет Reflection.Emit. Если пишете на Xamarin под iOS, то посмотрите в эту сторону, допустимо это не даст вовсе загрустить без IoC.

ToString
https://github.com/Fody/ToString
Как и Equals генерирует код на основе полей и как Вы, вероятно, теснее додумались по наименование генерирует способ ToString. Если дюже не хочется писать ToString для отладки, то это необходимый плагин, но польза подозрительна, я не могу припомнить, когда переопределял ToString не в отладочных целях.

Usable
https://github.com/Fody/Usable
Заворачивает в using локальные переменные имплементирующий IDisposable. Пишите отличнее ручками, надёжнее и внятней.

Validar
https://github.com/Fody/Validar
Разрешает встроить реализацию IDataErrorInfo и INotifyDataErrorInfo в класс, реализующий INotifyPropertyCanged. Во все классы, помеченные признаком InjectValidation будет заинжекчена реализация IDataErrorInfo и INotifyDataErrorInfo из класса с именем ValidationTemplate конструктор которого принимает INotifyPropertyChanged. Если пишите под WPF – непременно посмотрите, допустимо это именно то, что необходимо.

Visualize 
https://github.com/Fody/Visualize
Расставляет DebuggerDisplay признаки и если класс содержит поля, то генерирует «верный» код тот, что разрешает глядеть значение полей в режиме дебаггера. Увлекательно, что для последовательностей генерируется прокси класс. Дюже увлекательная вероятность, но я не дюже люблю сидеть в отладчике выбирая ему юнит тесты, так что платить временем сборки плана за вероятность всё посмотреть я бы не стал.

Это всё. Верю я сэкономил Вам несколько часов блуждания по гитхабу в поисках фоди плагинов. Спасибо за внимание.

*Все плагины я оценивал исходя из глубин своего невежества, так что умоляю не судить сурово, а оппонировать в комментариях.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB