2012-03-01 33 views
5

Trong AutoMapper 2.0, tôi đã sử dụng Cấu hình để định cấu hình ánh xạ của mình. Tôi sử dụng SourceMemberNameTransformerDestinationMemberNameTransformer để khớp với tên thuộc tính nguồn và đích của tôi.Thành viên bị thiếu trong AutoMapper 2.1.265

Trong 2.1.265 các thuộc tính này không còn trên Hồ sơ. Có ai biết tại sao họ bị loại bỏ không? Nhưng quan trọng hơn, làm thế nào tôi có thể nhân đôi chức năng này.

Sửa

Tôi đã nhìn vào SourceMemberNamingConventionDestinationMemberNamingConvention, nhưng tôi không thể tìm thấy bất kỳ tài liệu như thế nào những người làm việc. Có ai có kinh nghiệm sử dụng tùy chỉnh INamingConvention không?

Chỉnh sửa 2

thành viên nguồn được tạo ra từ một cơ sở dữ liệu bên thứ 3. Thông thường, họ sử dụng tất cả các tên cột chữ thường với dấu gạch dưới giữa các từ. Đôi khi họ bỏ qua dấu gạch dưới, đôi khi họ ném vào viết hoa ngẫu nhiên.

Thành viên đích cố gắng tuân theo quy ước đặt tên .NET càng nhiều càng tốt. Dấu gạch dưới đã bị xóa, ký tự đầu tiên sau dấu gạch dưới được viết hoa. Các thay đổi bổ sung đã được thực hiện để làm cho tên thành viên dễ đọc hơn.

Để giải quyết việc này, tôi đặt

SourceMemberNameTransformer = name => name.Replace("_", "").ToUpper() 
DestinationMemberNameTransformer = name => name.ToUpper() 

Sửa 3

biết thêm thông tin cho những người đến từ tương lai.

Tôi đã kiểm tra nguồn để xem cách INamingConvention được sử dụng. Cách nó được thiết kế nó một chút gây hiểu lầm. Giao diện được befined như

public interface INamingConvention 
{ 
    Regex SplittingExpression { get; } 
    string SeparatorCharacter { get; } 
} 

Tuy nhiên, AutoMapper không sử dụng định nghĩa đầy đủ của giao diện cho cả SourceMemberNamingConventionDestinationMemberNamingConvention

Phải mất mỗi thành viên của loại đích và áp dụng DestinationMemberNamingConvention.SplittingExpression. Sau đó, lấy các phần khớp đó và gọi string.Join bằng cách sử dụng SourceMemberNamingConvention.SeparatorCharacter. Sau đó, nó cố gắng khớp các thành viên loại nguồn với các thành viên kiểu đích.

Đây là tổng quan cấp cao về những gì đang diễn ra và không cố gắng mô tả đầy đủ chức năng. Nó chỉ có nghĩa là để hiển thị như thế nào INamingConvention được sử dụng và để hiển thị rằng SourceMemberNamingConvention.SplittingExpressionDestinationMemberNamingConvention.SeparatorCharacter không bao giờ được sử dụng.

Nếu bạn không thể chuyển đổi thành viên đích bằng chiến lược này, thì bạn phải ánh xạ theo cách thủ công các thuộc tính như nemesv's answer đề xuất.

Trả lời

1

Đường nối này bị xóa, xem GitHub.

EDIT Rewrite sau khi cập nhật câu hỏi:

Có lẽ việc xây dựng trong LowerUnderscoreNamingConvention giải quyết vấn đề của bạn. tôi đã thử nghiệm với mã này:

Mapper.Initialize(c => 
    c.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention()); 
Mapper.CreateMap<Source, Dest>(); 
var test = Mapper.Map<Dest>(
    new Source() { test_Another_Prop = "test", test_this_prop = "test" }); 

đâu SourceDest:

public class Source 
{ 
    public string test_this_prop { get; set; } 
    public string test_Another_Prop { get; set; } 
    public string test_wronglynamedprop { get; set; } 
} 

public class Dest 
{ 
    public string TestThisProp { get; set; } 
    public string TestAnotherProp { get; set; } 
    public string TestWronglyNamedProp { get; set; } 
} 

Nếu nó không bao gồm tất cả các trường hợp của bạn, bạn có thể kiểm tra cách thực hiện in the source và tạo convetion của riêng bạn.

EDIT: Sau khi bình luận:

Khi Công ước không áp dụng bạn có thể rơi trở lại bằng tay ghi đè lên các trường hợp đặc biệt:

Mapper.CreateMap<Source, Dest>() 
    .ForMember(d => d.TestWronglyNamedProp, c => c 
    .MapFrom(s => s.test_wronglynamedprop)); 

Tôi thấy không có lựa chọn nào khác trong phiên bản hiện hành. Bởi vì như xa như không thấy gì thay thế các MemberNameTransformer s.

+0

Vâng, tôi đã xem xét điều đó. Điều này không giúp tôi vì tôi không làm bất cứ điều gì với tiền tố hoặc postfix. – cadrell0

+0

Bạn có thể cung cấp một ví dụ cho thấy bạn đang cố đạt được điều gì không? – nemesv

+0

Tôi đã cập nhật câu hỏi – cadrell0

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