6

Tất cả các đối tượng và đối tượng giá trị của tôi triển khai giao diện điểm đánh dấu IEntityIValueObject. Tôi đã thiết lập chúng để được coi là các thành phần như vậy:Làm thế nào để tự động hóa một tập hợp các thành phần với Fluent NHibernate?

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); 
} 

Thật không may, điều này dường như không cho phép các thực thể có bộ sưu tập các đối tượng giá trị được tự động hóa làm bộ sưu tập thành phần. Ví dụ:

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

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

Có cách nào để xác định một quy ước như vậy mà, bất cứ lúc nào một IEntityIList của một loại mà thực hiện IValueObject, nó được ánh xạ như thể tôi đã quy định:

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

Những gì tôi không muốn làm là phải tự làm các ghi đè này cho mỗi lớp và viết ra từng thuộc tính cho đối tượng giá trị một lần nữa và một lần nữa.

Trả lời

0
  1. Tạo lớp mới kế thừa từ HasManyStep (FluentNHibernate.Automapping.Steps).
  2. Override phương pháp ShouldMap() với một cái gì đó như:

    return base.ShouldMap(member) && IsCollectionOfComponents(member) 
    
  3. Thêm logic của bạn để:

    public void Map(ClassMappingBase classMap, Member member) 
    { ... } 
    
  4. Thay thế bước mặc định với cái mới của bạn:

    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; 
        } 
    } 
    

Lưu ý: Bạn cũng có thể lấy mã nguồn ban đầu của HasManyStep.cs và sao chép nó vào dự án của bạn để giới thiệu logic tùy chỉnh của bạn.

Các vấn đề liên quan