15 февраля 2010 г.

[Ann] UniversIS.Components

v3.0.0.2: Bin. Source. Заметки к выпуску.

Что такое UniversIS.Components?
Это библиотека компонент, дополняющих (и подправляющих) функционал BCL. Этакий мусоросборник для всех костылей, потребовавшихся для очередного проекта. Поскольку вечный дежурный по костылям – я, автор у UniversIS.Components один;)

Что такое UniversIS?
Университетская ИС. В период обострения выдаётся за universal IS, а при созревании очередных планов по захвату мира обыгрывается созвучность с universe. Мне стыдно. Но я тут ни при чём. Честное слово.

На самом деле UniversIS – это маааленькая и симпатичная монстр-методология, включающая в себя кучу best practices – от рекомендаций по настройке прав ФС на сервере с MS SQL и до фреймворка для разработки ИС с авторазвёртыванием, безопасностью, пасьянсом и аншлагом. Из-за малочисленности контингента, непреходящего дедлайна и других отмазок предназначена только для внутреннего применения. Но всё выправляется:)

На каких условиях распространяется UniversIS.Components?
Безвозмездно, то есть задаром. Ключевое слово – безвозмездно: никаких претензий с моей стороны, никаких – с вашей;)

Поддержка?
Увы, нет. Точнее, регулярно будут публиковаться свежие версии, менее регулярно – выкладываться архивы исходников, и так быстро, как возможно – исправляться баги и реализовываться предложения (в пределах разумного, разумеется). На этом всё.

UniversIS.Components не будет опубликован в публичном репозитарии: он жизненно важен для внутренних проектов, а код сильно зависит от environment’a. Заниматься синхронизацией публичного репозитария и внутреннего не смогу, уж извините.

Состояние кода/документация?
Плюс: Stable. Вылизан, guidelined, FxCop’ed и StyleCop’ed от и до.
Минус: Минимум комментариев. Нет XML comments. Времени на их написание тоже нет. По мере возможности будут публиковаться посты с документацией. Оставляйте ваши заявки;)

Совместимость версий?
По возможности – без необходимости перекомпиляции вашего кода. Устаревающий API помечается Obsolete(false), в следующей минорной версии - Obsolete(true). В следующей мажорной – удаляется. (Да-да, best practices.)

Как будет в будущем – неизвестно, считайте что я вас предупредил.

Prerequisites?
В теории - .Net Framework 2.0. На практике - .Net Framework 2.0 sp1

Аналоги?
Великолепная подборка: .NET Utility Libraries Galore. Ещё - Miscellaneous Utility Library. Об остальных не знает ни гугл, ни Visual Studio Gallery, ни LabDotNet, ни Blocks4.net. Знаете вы? Добавьте.

Из непрямых аналогов - Microsoft Enterprise Library (но она решает проблемы на более высоком уровне). А также C5 Generic Collection Library, Wintellect Power Collections и другие замечательные узкопрофильные библиотеки.

Что оно умеет?
Красным
- полезное.

namespace UniversIS
{

  • ActionWrappers, FuncAsActionWrappers, FuncWrappers – классы для carrying’а делегатов. Из плюсов – нет проблем с замыканиями, из минусов – необходимость явно указывать генерик-параметры.
  • BinarySize – структура, хранящая размер в байтах. Форматирование, перевод в целые/дробные экзабайты прилагается.
  • Code – code assertions. В комплекте – правила по написанию аналогичных классов (to be defined).
  • DelegateHelper – кастинг делегатов; получение real invocation list; generic-обёртки к Delegate.CreateDelegate (перед употреблением ознакомиться с инструкцией).
  • EnumCode – тот самый “аналогичный Code класс”. Assertions для перечислений.
  • EnumHelper – helper для битовых операций со значениями перечислений. Шустр, так как использует emitted il (см UniversIS.Arithmetic.Operators<T>).
  • InvariantString, UserString – классы-хелперы для явного отделения работы со строками для представления пользователю, от работы со строками для хранения данных. См New Recommendations for Using Strings in .NET 2.0. (И снова best practices.)
  • StringHelper – множественная замена/объединение. Также см. UniversIS.Text.TextTokenizer.
  • WeakReference<T> – генерик-обёртка к WeakReference + операторы сравнения на идентичность.

}
namespace UniversIS.Arithmetic
{

  • Arithmetic<T> – обёртка вокруг любого типа, реализующего стандартные операторы. Написан для локального холивара “а в .NET нельзя писать универсальные математические алгоритмы”, да так и прижился (использует UniversIS.Arithmetic.Operators<T>). На практике абсолютно бесполезен.
  • ComparisonHelper – хелпер для правильного сравнения значений. В основном используется при переопределении операторов сравнения.
  • OperatorBuilder – чуть-чуть Reflection.Emit и делегат–вызов стандартного оператора на выходе.
  • Operators<T> – type-keyed bag для кэширования готовых операторов.

}
namespace UniversIS.Collections
{

  • EnumerableCode – очередные assertions. На этот раз для коллекций.
  • EnumerableHelper – велосипед. Коллекция итераторов для работы с IEnumerable: Cast, Where…

}
namespace UniversIS.Collections.Generic

{

  • CollectionWrappers, ComparerWrappers  – helper’ы. Чтобы не заблудиться в зоопарке из UniversIS.Collections.Generic.Wrappers
  • IndexedList<T> – список с индексированными значениями.
  • OrderedDictionary<TKey, TValue> – словарь с гарантированным порядком хранения.
  • TwoWayDictionary<TKey, TValue> – словарь с уникальными значениями.
  • WeakKeyDictionary<TKey, TValue> – ключ – UniversIS.WeakReference<T>; ручная/автоматическая очистка от мёртвых значений.

}
namespace UniversIS.Collections.Generic.Base
– базовые классы, реализующие типизированные и нетипизированные версии интерфейсов ICollection, IList, IDictionary, IComparer, IEqualityComparer.

namespace UniversIS.Collections.Generic.Wrappers – обёртки вокруг типов, соответствующих интерфейсов. Как бонус – флаг readOnly в конструкторе. Полезны в основном для выставления коллекций через свойства и для работы с нетипизированными коллекциями ч/з generic interface. На практике заменяются стандартной ReadOnlyCollection<T>.

namespace UniversIS.Collections.ObjectModel
{

  • DisposableCollection<T> – Dispose значений при Dispose коллекции.
  • KeyedCollectionBase<TKey, TItem> – кавер стандартной KeyedCollection<TKey, TItem>. Не допускает null-ключей.
  • KeyedMappedCollectionBase<TParentItem, TKey, TItem>,
    MappedCollectionBase<TParentItem, TItem> – коллекции для реализации связи один-ко-многим. Автоматически заменяют родителя элемента при добавлении/удалении из коллекции.

}
namespace UniversIS.ComponentModel
{

  • EventKey, LockKey – примитивные классы для использования соответственно как lock key и event key. Чтобы не возникало искушения использовать что попало.
  • InitializableComponentBase – базовая реализация ISupportInitializeNotification.
  • Invokers – helper для облегчения работы с UniversIS.ComponentModel.Invocation (см. ниже).
  • LockedEventHandlerList – обёртка вокруг EventHandlerList. Добавляет блокировку при подписке/отписке событий.

}
namespace UniversIS.ComponentModel.BindingLists
– реализации IBindingListView. Базовый generic-класс, обёртка с ограничением допустимых действий и MultiSourceBindingList<T>  - сцепление нескольких списков в 1.

namespace UniversIS.ComponentModel.Invocation – набор классов для вызова делегатов асинхронно (AsyncInvoker), внутри блокировки (LockInvoker), или в заданном контексте синхронизации (читай в другом потоке – SynchronizationContextInvoker, SynchronizeInvoker).

namespace UniversIS.ComponentModel.WorkModel
{

  • WorkItem – базовый класс для реализации примитивных операций. Готовые work items:
    • ActionWorkItem – выполнение указанного действия.
    • ConcurrentWorkItem – выполнение вложенных work items в разных потоках.
    • UniversIS.Data.Common.DataSetWorkItem – backup/отключение ограничений датасета и выполнение вложенных work items.
    • UniversIS.Data.Common.DbConnectedWorkItem – соединение/транзакция и выполнение вложенных work items.
    • UniversIS.Data.Common.DbTableAdaptersWorkItem – установление свойств заданных TableAdapters и выполнение вложенных work items.
    • UniversIS.IO.FileSystemBackupWorkItem - backup заданного пути и выполнение вложенных work items.
  • MultiWorkItem - позволяет группировать work items в дерево операций.
    Каждый WorkItem хранит ссылку на родительский MultiWorkItem и может получить его свойства (и свойства его родителей) – готов контекст внутри каждой ветки work tree. Большинство work items унаследованы от MultiWorkItem.
  • Worker – базовый класс для компонент, использующих WorkModel. Не допускает одновременного выполнения нескольких работ (используется LockInvoker), позволяет запускать выполнение в фоновом потоке (используется AsyncInvoker) и вызывать события в исходном потоке (используется любой из наследников SyncInvoker).

}
namespace UniversIS.Data
{

  • DataRowHelper, DataTableHelper– хелперы для рутинных операций с соответствующими типами. Ничего особенного и уникального.
  • DataViewHelper – получение DataRow из DataRowView/индекса и обратно.
  • DataTableNewValueSearch<TDataRow>, DataTableSearch<TDataRow> – поиск значений в DataTable с исользованием DataView.FindRows (перед употреблением ознакомиться с инструкцией). Крайне рекомендуется вызывать Dispose во избежание проблем с биндингом.
  • DataTableSelectHelper – хелпер для составления filter strings.

}
namespace UniversIS.Data.Common
{

  • DataSetAdapter – решение из коробки для синхронизации DataSet’ов с БД на основе UniversIS.ComponentModel.WorkModel. Шаринг соединения, транзакции, маппинг таблиц, умное обновление (с учётом ограничений и порядка добавления/удаления строк) и простая кастомизация под самые разнообразные сценарии.
  • DbDataAdapterHelper – хелпер для рутинных действий с DbDataAdapter – установление соединения, транзакций и т.п. каждой команде.
  • DbTableAdapter – базовый класс для typed table adapters.

}
namespace UniversIS.Diagnostics
{

  • ProcessSingleton – проверка запущенного экземпляра и передача параметров командной строки. Использует IpcChannel + UniversIS.Runtime.Remoting.Channels.ValidationSink, так что передать параметры удалённо (и получить несанкционированный доступ) не выйдет.
  • TraceListenerBase – базовый класс для реализации trace listener’s.
  • Tracer – наследник TraceSource. Добавлены методы для трассировки типичных событий и удобная трассировка операций ч/з TraceOperation.

}
namespace UniversIS.IO
{

  • FileSystemCode – assertions. На этот раз для файлов/директорий.
  • FileSystemHelper – хелпер для работы с файловой системой. NB: рассчитан на работу с правильно сформированными путями (см. PathInfo). Поиск свободных путей; обход папок; копирование/перемещение папок/файлов с возможностью отката при ошибке (просто как топор – копия или перемещение перед началом операции).
  • PathCode – assertions для путей
  • PathHelper, PathNameHelper – хелперы для обработки путей и имён папок/файлов.
  • PathInfo – класс, хранящий правильно сформированный путь. Информация о токенах в пути, типе и т.д; быстрые операции над путями (слияние, получение общего/относительного пути и т.п.).
}
namespace UniversIS.Reflection
{
  • AssemblyInformation – класс, предоставляющий сведения из стандартных атрибутов сборки.
  • ReflectionHelper – хелпер для типовых операций с метаданными. Получение полей/методов/свойств; обёртка методов в делегаты с помощью UniversIS.DelegateHelper.
}
namespace UniversIS.Text
{
  • TextTokenizer – класс для разделения строк на токены. Отдаёт только информацию о смещении/длине токена, не производя самого разбиения.

}

Предыдущие версии:

v3.0.0.0: Bin. Source. Заметки к выпуску:

UPD: как всегда релиз не обошёлся без накладок – перед публикацией не был сделан чек-ин, и потерялись последние изменения. Исправленная версия выложена 17.12.2009 в 10:05 GMT (13:05 Москвы), ссылки те же. Если кому-то не повезло – скачайте ещё раз, пожалуйста. Мои извинения.

UPD2: Да что ж такое-то??? Очередной косяк: событие UniversIS.Data.Common.DataSetAdapter.QuerySynchronize из-за кривости рук автора оказалось названо UniversIS.Data.Common.DataSetAdapter.QueryDataSetAdapter. Исправлено 18.12.2009 в 03:43 GMT (06:43 Москвы), ссылки те же (и билд, и исходники).

С целью борьбы с намечающимся фейлом будем считать релиз состоявшимся. Все последующие исправления не будут нарушать бинарную совместимость, косяки будут помечаться Obsolete.

Будем надеяться, продолжения цирка не последует. Единственный плюс: вы можете убедиться что ошибки будут исправляться.

Комментарии/предложения?

Комментариев нет:

Отправить комментарий