6

私のすべてのエンティティと値オブジェクトは、マーカー インターフェイスIEntityIValueObject. 次のようにコンポーネントとして扱われるように設定しました。

public override bool IsComponent(Type type)
{
    return typeof(IValueObject).IsAssignableFrom(type);
}

public override bool ShouldMap(Type type)
{
    return typeof(IEntity).IsAssignableFrom(type) || typeof(IValueObject).IsAssignableFrom(type);
}

残念ながら、これは、値オブジェクトのコレクションを持つエンティティをコンポーネント コレクションとして自動マッピングすることを許可していないようです。例えば:

public class MyEntity : IEntity
{
    public IList<MyValueObject> Objects { get; set; }
}

public class MyValueObject : IValueObject
{
    public string Name { get; set; }
    public string Value { get; set; }
}

がを実装する型の をIEntity持っているときはいつでも、指定したかのようにマップされるように、規則を定義する方法はありますか?IListIValueObject

HasMany(x => x.Objects)
    .Component(x => { 
        x.Map(m => m.Name); 
        x.Map(m => m.Value); 
    });

私がやりたくないのは、これらのオーバーライドをすべてのクラスに対して手動で行い、値オブジェクトの各プロパティを何度も書き出す必要があることです。

4

1 に答える 1

1
  1. HasManyStep(FluentNHibernate.Automapping.Steps)から継承する新しいクラスを作成します。
  2. 次のようなものでShouldMap()メソッドをオーバーライドします。

    return base.ShouldMap(member) && IsCollectionOfComponents(member)
    
  3. ロジックを次の場所に追加します。

    public void Map(ClassMappingBase classMap, Member member)
    { ... }
    
  4. デフォルトのステップを新しいステップに置き換えます。

    public class MyMappingConfiguration : DefaultAutomappingConfiguration
    {
        public override IEnumerable<IAutomappingStep> GetMappingSteps(AutoMapper mapper, IConventionFinder conventionFinder)
        {
            var steps = base.GetMappingSteps(mapper, conventionFinder);
            var finalSteps = steps.Where(c => c.GetType() != typeof(FluentNHibernate.Automapping.Steps.HasManyToManyStep)).ToList();
            var idx = finalSteps.IndexOf(steps.Where(c => c.GetType() == typeof(PropertyStep)).First());
            finalSteps.Insert(idx + 1, new MyCustomHasManyStep(this));
            return finalSteps; 
        }
    }
    

注:HasManyStep.csの元のソースコードを取得してプロジェクトにコピーし、カスタムロジックを導入することもできます。

于 2011-11-14T16:23:08.747 に答える