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.
Будем надеяться, продолжения цирка не последует. Единственный плюс: вы можете убедиться что ошибки будут исправляться.
Комментарии/предложения?
Комментариев нет:
Отправить комментарий