Свободно-Nibernate с wpf: соглашение использовать uNhAddIns ... ObservableListType <T>по умолчанию? - PullRequest
3 голосов
/ 02 февраля 2011

Я пытаюсь использовать Fluent-Nibernate с wpf, для которого требуются наблюдаемые коллекции (реализует интерфейс INotifyCollectionChanged).

В uNHAddins: Неофициальные надстройки для NHibernate я нашел

    uNhAddIns.WPF.Collections.Types.ObservableListType<T>

, который реализует INotifyCollectionChanged.В Fluent-Nibernate его можно настроить следующим образом:

    namespace FluentNHibernateTutorial.Mappings
    {
        public class StoreMap : ClassMap<Store>
        {
            public StoreMap()
            {
                Id(x => x.Id);
                Map(x => x.Name);
                HasManyToMany(x => x.Products)
                 .CollectionType<uNhAddIns.WPF.Collections.Types
                                      .ObservableListType<Product>>()
                 .Cascade.All()
                 .Table("StoreProduct");
            }
        }
    }

Кто-нибудь знает, как реализовать конвенцию с Fluent-Nibernate, который всегда использует ObservableListType в качестве реализации IList по умолчанию ?

Обновление: идеальным решением было бы то, что делает замену с Fluent-NHibernate-Automapper

1 Ответ

7 голосов
/ 25 февраля 2011

Примерно так должно получиться:

public class ObservableListConvention :
    IHasManyConvention, IHasManyToManyConvention, ICollectionConvention {

    // For one-to-many relations
    public void Apply(IOneToManyCollectionInstance instance) {

        ApplyObservableListConvention(instance);
    }

    // For many-to-many relations
    public void Apply(IManyToManyCollectionInstance instance) {

        ApplyObservableListConvention(instance);
    }

    // For collections of components or simple types
    public void Apply(ICollectionInstance instance) {

        ApplyObservableListConvention(instance);
    }

    private void ApplyObservableListConvention(ICollectionInstance instance) {

        Type collectionType =
            typeof(uNhAddIns.WPF.Collections.Types.ObservableListType<>)
            .MakeGenericType(instance.ChildType);
        instance.CollectionType(collectionType);
    }
}

В ответ на обновление вопроса:

Это соглашение должно работать с автоматом так:

AutoMap.AssemblyOf<Store>(cfg)
  .Conventions.Add<ObservableListConvention>();
...