2012-03-23 14 views
7

Tôi không chắc liệu mình có vấn đề về luồng hay không. Khi tải trang, tôi đang thực hiện hai yêu cầu Ajax để tải thêm một số dữ liệu từ API của bên thứ ba. Dưới đây là ý nghĩa của từng phương thức được gọi là:Sự cố phát tán AutoMapper (Thiếu cấu hình bản đồ loại hoặc bản đồ không được hỗ trợ)?

private List<CaseCommentModel> GetCaseCommentModels(string caseId) { 
    var comments = CaseService.GetAllCaseCommentsByCaseId(caseId); 

    Mapper.Reset(); 
    Mapper.CreateMap<CrmCaseComment, CaseCommentModel>(); 

    var caseCommentModels = Mapper.Map<List<CrmCaseComment>, List<CaseCommentModel>>(comments); 

    return caseCommentModels; 
} 

private List<CaseAttachmentModel> GetCaseAttachmentModels(string caseId) { 
    var attachments = AttachmentService.GetAttachmentsByParentId(caseId); 

    Mapper.Reset(); 
    Mapper.CreateMap<CrmAttachment, CaseAttachmentModel>(); 

    var caseAttachmentModels = Mapper.Map<List<CrmAttachment>, List<CaseAttachmentModel>>(attachments); 

    return caseAttachmentModels; 
} 

Đôi khi cả hai câu trả lời đều thành công. Nhưng, nếu tôi làm mới trang, đôi khi người ta sẽ thất bại với các ngoại lệ sau đây:

Missing type map configuration or unsupported mapping

Tôi có thể đi từ cả hai yêu cầu thành công với một thất bại mà không thực hiện bất kỳ thay đổi mã; tất cả những gì cần làm là làm mới trang. Đây có phải là vấn đề luồng hay tôi đang sử dụng trình ánh xạ không chính xác?

Trả lời

5

Bạn nên tạo Ánh xạ chỉ sau khi cho mỗi lần ứng dụng. Vì vậy, hãy di chuyển từng CreateMap cụ thể để bắt đầu ứng dụng.

Vấn đề bạn đang gặp có lẽ liên quan đến cuộc đua để làm các bản đồ trước khi thread khác gọi Mapper.Reset()

10

Vâng, bạn có một vấn đề luồng và bạn đang lạm dụng cấu hình Automapper. Từ Automapper getting started page:

Nếu bạn đang sử dụng phương pháp Mapper tĩnh, cấu hình chỉ cần xảy ra một lần mỗi AppDomain. Điều đó có nghĩa là nơi tốt nhất để đặt mã cấu hình đang khởi động ứng dụng, chẳng hạn như tệp Global.asax cho các ứng dụng ASP.NET. Thông thường, cấu hình lớp bootstrapper nằm trong lớp riêng của nó và lớp bootstrapper này là được gọi từ phương thức khởi động.

Vì vậy, bạn không nên có Mapper.CreateMap bên trong các hành động của bộ điều khiển sẽ chuyển chúng đến địa điểm chung và thực hiện chúng một lần.

Hoặc nếu bạn cần cấu hình bản đồ năng động không sử dụng các tĩnh Mapper thay vì xây dựng cấu hình và động cơ "bằng tay":

var config = 
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 
config.CreateMap<CrmCaseComment, CaseCommentModel>(); 
var engine = new MappingEngine(config); 
var caseCommentModels = 
    engine.Map<List<CrmCaseComment>, List<CaseCommentModel>>(comments); 
+0

+1 cho cấu hình động – zidane

1

Tôi đã xem qua một luồng vấn đề và muốn để chia sẻ những phát hiện của tôi.

Trong ứng dụng của tôi trong Dịch vụ WCF Constructor tôi gọi là AutoMapperRegistry. Định cấu hình() để tạo Ánh xạ cho trình ánh xạ tự động.

Từ bộ điều khiển MVC tôi gọi là dịch vụ bằng cách gọi đối tượng singleton của các dịch vụ WCF.

Các thực tế vấn đề là từ khách hàng web Tôi thực sự gọi asyncrounusly hai trong số những phương pháp điều khiển để cả hai thông báo cho các dịch vụ và trả về kết quả. Khoảnh khắc i thay đổi phương thức đầu tiên thành Không đồng bộ sai trong sự cố đã được giải quyết.

Lý do Khi cả hai phương pháp này được gọi là async điều kiện chủng tộc xảy ra và một lần trong một thời gian mà được giải quyết bởi nó tự đôi khi vấn đề luồng này được tạo ra kết quả là ngoại lệ trên được ném.

0

Có, bạn có vấn đề về luồng và giải pháp tốt nhất (theo ý kiến ​​của tôi) là ngừng sử dụng API tĩnh từ AutoMapper.

Tôi đề nghị bạn cấu hình automapper theo cách follwoing: // IoC đăng ký (Autofac trong trường hợp của tôi)

builder 
    .Register(c => new MapperConfiguration(cfg => { 
     cfg.AddProfile<AutoMapperProfile>(); 
    })) 
    .SingleInstance(); 
builder 
    .Register(c => c.Resolve<MapperConfiguration>().CreateMapper()) 
    .As<AutoMapper.IMapper>(); 

Xin lưu ý rằng tôi có thể tạo MapperConfiguration như trường hợp duy nhất. Lớp AutoMapperProfile.cs chứa cấu hình của automapper:

class AutoMapperProfile : Profile 
{ 
    public AutoMapperProfile() 
    { 
     CreateMap<Source, Destination>(); 
     // usual configurations... 
    } 
} 
Các vấn đề liên quan