2010-02-02 32 views
34

Tôi đang sử dụng AutoMapper trong trang ASP.NET MVC để ánh xạ đối tượng cơ sở dữ liệu của mình cho đối tượng ViewModel và tôi đang cố gắng sử dụng một số cấu hình để ánh xạ cùng loại, nhưng sử dụng một logic khác. Tôi đã có ý tưởng làm như vậy bằng cách đọc số Matt's blog post nơi anh ấy nói:Sử dụng cấu hình trong Automapper để ánh xạ cùng loại với logic khác nhau

Phần thực sự quan trọng là cấu hình cấu hình AutoMapper. Bạn có thể nhóm cấu hình với cấu hình. Có thể trong một cấu hình bạn định dạng ngày theo một cách, trong một cấu hình khác, bạn định dạng ngày theo một cách khác. Tôi chỉ sử dụng một hồ sơ ở đây.

Vì vậy, tôi đã tạo ra một hồ sơ cá nhân cho một trường hợp:

public class MyProfile : Profile 
{ 
    protected override string ProfileName 
    { 
     get 
     { 
      return "MyProfile"; 
     } 
    } 

    protected override void Configure() 
    { 
     CreateMap<DateTime, String>().ConvertUsing<StringFromDateTimeTypeConverter>(); 
    } 
} 

public class StringFromDateTimeTypeConverter : ITypeConverter<DateTime, String> 
{ 
    public string Convert(DateTime source) 
    { 
     return source.ToString("dd/mm/yyyy", CultureInfo.InvariantCulture); 
    } 
} 

Và một số khác cho một trường hợp khác:

public class MyProfile2 : Profile 
{ 
    protected override string ProfileName 
    { 
     get 
     { 
      return "MyProfile2"; 
     } 
    } 

    protected override void Configure() 
    { 
     CreateMap<DateTime, String>().ConvertUsing<AnotherStringFromDateTimeTypeConverter>(); 
    } 
} 

public class AnotherStringFromDateTimeTypeConverter : ITypeConverter<DateTime, String> 
{ 
    public string Convert(DateTime source) 
    { 
     return source.ToString("mm - yyyy", CultureInfo.InvariantCulture); 
    } 
} 

Tuy nhiên, tôi không thể tìm thấy bất kỳ tình trạng quá tải của các phương pháp Mapper.Map<>() để xác định một Hồ sơ. Tôi cũng đã có một cái nhìn tại các đối tượng Configuration không có may mắn.
Hồ sơ đăng ký cuối cùng luôn được ưu tiên.

Có cách nào để sử dụng hồ sơ cho mục đích này không?

Trả lời

39

Tiểu sử dành cho việc tách riêng cấu hình chung được áp dụng trên một số loại bản đồ, như định dạng. Tuy nhiên, loại bản đồ vẫn là toàn cầu. Bạn nên tạo các đối tượng Cấu hình riêng biệt và tạo một MappingEngine riêng cho từng đối tượng. Lớp Mapper chỉ đơn thuần là một mặt tiền tĩnh trên mỗi lớp, với một số quản lý vòng đời.

+0

Cảm ơn, tôi sẽ làm điều đó! – sebd

+0

Đó có phải là chủ đề an toàn mặc dù không có khóa không? Ví dụ 'MapperRegistry.AllMappers()' là tĩnh và 'TypeMapFactory' có một từ điển tĩnh. –

+0

Thông thường cấu hình chỉ được gọi một lần cho mỗi AppDomain khi khởi động. Bạn chỉ cần tìm đường may phù hợp trong bất kỳ mô hình lưu trữ nào bạn có cho vị trí đó (khác với WCF, ASP.NET, WinForms, v.v.) –

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