Archives du mot-clé Obtics

Obtics ou comment gérer de facon dynamique ses objets métiers….

N’importe quel développeur SL/WPF à l’habitude de gérer les évènements PropertyChanged, CollectionChanged et ça devient vite très chiant dans certains cas. Je vais vous présenter une libraire appelée Obtics, mais attention je vous avertis, on en tombe vite accroc.

Un cas simple, vous avez une ObservableCollection d’objet métier que vous voulez encapsuler dans un ensemble de ViewModel.

1
2
3
4
5
6
7
8
9
10
11
public class MainViewModel: ViewModelBase
{
        private readonly ObservableCollection<BusinessObject> _collection;
 
        public MainViewModel(ObservableCollection<BusinessObject> collection)
        {
            _collection = collection;
        }
 
        public IEnumerable<BusinessObjectViewModel> Entities { get; set; }
}

En temps normal, vous vous abonneriez à l’évènement CollectionChanged de l’ObservableCollection et vous gériez la fameuse routine des NotifyCollectionChangedAction.

Mais là, Obtics (comme toujours ?) va vous simplifier la vie, voici comment faire avec Obtics :

1
2
3
4
5
6
7
8
9
10
public MainViewModel(ObservableCollection<BusinessObject> collection)
{
    _collection = collection;
 
    IValueProvider<IEnumerable<BusinessObjectViewModel>> valueProvider = ExpressionObserver.Execute(
    () => _collection.Select(bo => new BusinessObjectViewModel(bo)));
 
 
    this.Entities = valueProvider.Cascade();
}

Obtics va « Compiler » votre LambdaExpression en pipeline de création d’un objet qui va automatiquement s’abonner aux évènements nécessaires pour tenir toujours à jour la valeur fournit par le IValueProvider fournit.

Dans le cas de IValueProvider<IEnumerable<T>>, il est possible de « merger » les évènements de changement de valeur de l’IEnumerable<T> pour obtenir un IEnumerable<T>.

En gros, si la propriété Value de valueProvider change alors la collection obtenue par Cascade(), va faire un NotifyCollectionChangedAction.Add, NotifyCollectionChangedAction.Remove de la différence ou un NotifyCollectionChangedAction.Reset.

 

Pour aller plus loin, imaginons que vous voulez filtrer sur vos objets qui ont la propriété « Name » commençant par « Vin », il suffit de faire :

ExpressionObserver.Execute(() => this._collection.Where(bo => bo.Name.StartsWith("Vin")).Select(bo => new BusinessObjectViewModel(bo))).Cascade();

Sympa non ?

Il y a beaucoup de principes à comprendre dans cette libraire avant de l’exploiter au maximum, j’attends vos retours pour continuer de blogger dessus…