3

Observableコレクションを必要とするwpfでFluent-Nibernateを使用しようとしています(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");
            }
        }
    }

デフォルトのIList実装として常にObservableListTypeを使用するFluent-Nibernateを使用してコンベンションを実装する方法を知っている人はいますか?

更新:完璧な解決策は、Fluent-NHibernate-Automapperに置き換えるものです。

4

1 に答える 1

7

このような何かがトリックを行う必要があります:

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>();
于 2011-02-25T08:08:48.183 に答える