вторник, 20 августа 2013 г.

Фреймворк: Rikrop.Core обзор

Эта статья служит оглавлением и кратким справочником по фреймворку для быстрой разработки приложений Rikrop.Core.
Прежде всего нужно сказать, что мы приняли для наших проектов правило использовать Unity в качестве инструмента DI. Мы используем паттерн Model-View-ViewModel и стараемся сделать код максимально тестируемым.

Rikrop.Core.Framework.dll

Эта библиотека содержит множество наиболее обобщенных инструментов, которые находят применение из проекта в проект. Здесь находятся методы-расширения для стандартных контейнеров .NET, удобные реализации таймера, дополнительные типы данных для манипуляций с датами, классы-обёртки для работы с Active directory, инструменты разбора деревьев логических выражений, инфраструктура для работы с исключениями, абстракции для логирования и работы с сервисным слоем приложения.

Rikrop.Core.Framework.Unity.dll

Библиотека с методами-расширениями IUnityContainer для регистрации и автоматической генерации кода фабрик объектов, предназначенных для избавления от избыточного кода для реализации dependency injection и ускорения процесса разработки приложений.

Rikrop.Core.Wpf.dll

Фреймворк: Rikrop.Core.Wpf.dll. Часть 0, INotifyPropertyChanged
Нам было жизненно необходимо сделать разработку на wpf максимально удобной для нас, при этом тесно интегрировать презентационный слой приложения с нашим фреймворком. Как и во всех проектах фреймворка, мы ставили задачу гибкости и прозрачности использования разрабатываемого инструмента. WPF-библиотека является надстройкой и расширением над переносимой сборкой Rikrop.Core.Presentation.Portable.dll. Основные блоки библиотеки:
  • Набор настраиваемых элементов управления на все случае жизни.
  • Элементы управления и хелперы для максимального контроля за кастомизацией отображения окна приложения.
  • Расширение механизма команд и реализации удобных средств создания и управления состоянием команд.
  • Инфраструктура для удобной работы с коллекциями - коллекции, нотифицирующие об изменениях, постраничные загрузчики коллекций, динамически загружаемые коллекции.
  • Наиболее полный и пополняемый набор из 50+ конвертеров значений. 
  • Пополняемый набор частоупотребимых и незаменимых во многих проектах attached properties.
  • Обработчики исключений уровня приложения, отображающие информацию об исключении в понятном виде. 
  • Механизмы для управления визуализацией отображений в приложении.
  • Базовые реализации объектов, нотифицирующих об изменениях своих свойств.
  • Полная и самодостаточная реализация классов для быстрой разработки в рамках паттерна mvvm.
  • Набор инфраструктурных классов для обеспечения отзывчивости приложения.
Библиотека Rikrop.Core.Wpf.dll является одной из самых объёмных в фреймворке и занимает центральное положение при разработке удобного, красивого и отзывчивого отображения в наших проектах.

Rikrop.Core.Wcf.Unity.dll

В этой библиотеке мы собрали методы для простой и быстрой регистрации WCF-сервисов без использования громоздких конструкций в конфигурационных файлах. Это одна из двух библиотек, которая сделала использование wcf в наших приложениях совершенно прозрачным. Созданная инфраструктура позволила нам не заботиться об актуальности конфигурации сервисов и вызывать wcf так же просто, как и локальные методы.
Rikrop.Core.Dataflow.dll

Rikrop.Core.Exceptions.dll

Rikrop.Core.Framework.Portable.dll

Rikrop.Core.Presentation.Portable.dll

Rikrop.Core.Wcf.Portable.dll

Rikrop.Core.Logging.dll

Rikrop.Core.Logging.NLog.dll

Rikrop.Core.MapReduce.dll

Rikrop.Core.Network.dll

Rikrop.Core.Testing.dll

Rikrop.Core.Threading.dll

Rikrop.Core.Wcf.dll


Rikrop.Core.Wpf.Unity.dll

3 комментария:

  1. Добрый день, прочитал про фреймворк на хабре и решил попробовать его
    использовать в своем проекте.
    До этого я использовал стандарную настройку сервисов.
    Что бы контролировать доступ был использован контракт следующего вида
    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IAuthService
    {
    [OperationContract(IsInitiating = true,IsTerminating = false)] ServiceResult Login(string userName,string password);
    [OperationContract(IsInitiating = false,IsTerminating = true)]
    string Logout();
    [OperationContract(IsInitiating = false, IsTerminating = true)]
    ServiceResult> GetAllGCClients();
    [OperationContract(IsInitiating = true, IsTerminating = true)]
    ServiceResult> GetAllReportAggregators();
    }
    Вопросы:1. Можно ли добавить в сессию поведение, что бы дублировало
    поведение при вызове методов из контракта, те некоторые методы требуют
    логина, некоторые - нет.*

    *2. Если использовать Behavior для регитстрации сессии, нужно ли указывать
    свойства в атрибутах?*
    *3. Это ближе к замечаниям: при вызове метода, если не регистрировать
    Behavior для использования сессии, нормально вызывается метод *
    * ServiceResult>
    GetAllReportAggregators();*

    но возникает ошибка при вызове
    ServiceResult>
    GetAllGCClients();

    ОтветитьУдалить
    Ответы
    1. Добрый день.
      К сожалению, парсер жрёт комментарии с кодом и я не совсем понял 3 вопрос, т.к. нет нет понятного примера, да и в первом не уверен. Но постараюсь ответить.

      1. Атрибуты не нужны, другое дело - как разделить AllowAnonymous-методы от остальных.
      Если это разделение на уровне сервисов, то никакой проблемы нет - вы можете разделить серверную часть на 2 хостера, каждый из которых будет в своём IoC-контейнере. Если же хочется вызывать часть методов в рамках одного сервиса (что я, честно сказать, встречал чаще), то нужно будет, скорее всего, использовать на клиенте при регистрации WithCustomMessageInspectorFactory и свою реализацию. Для примера можно посмотреть, как реализована стандартная фабрика. Это, кстати, будет решением и в первом случае, при том более универсальным.

      2. Нет, в атрибутах дублировать не нужно контейнерную регистрацию.

      3. К сожалению, парсер слишком постарался над примерами кода и вопроса я не понял.

      Удалить
    2. Необходимые ссылки.
      1. Фабрика
      2. Инспектор

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

      Удалить