2013-04-22 54 views
7

Tôi đang cuộn qua AutoMappers của mình bằng cách sử dụng một lớp AutoMapperConfiguration lớn để sử dụng các cấu hình thực tế. Toàn cầu hiện nay trông giống như vậy (tha thứ Mở/Đóng vi phạm cho bây giờ)Cấu hình AutoMapper và Kiểm tra Đơn vị

Mapper.Initialize(x => 
         { 
          x.AddProfile<ABCMappingProfile>(); 
          x.AddProfile<XYZMappingProfile>(); 
          // etc., etc. 
        }); 

Phần quan trọng mà đã cho tôi trên đầu trang và trở ngại mà trước đó đã luôn luôn dừng lại cho tôi từ việc sử dụng hồ sơ là Ninject tôi ràng buộc. Tôi không bao giờ có thể bắt buộc phải làm việc. Trước khi tôi có điều này ràng buộc:

Bind<IMappingEngine>().ToConstant(Mapper.Engine).InSingletonScope(); 

Tôi đã di cư đến từ ràng buộc này:

Bind<IMappingEngine>().ToMethod(context => Mapper.Engine); 

này hiện đang làm việc, ứng dụng này là chức năng, tôi có cấu hình, và điều này là tốt.

Trục trặc hiện nằm trong các thử nghiệm đơn vị của tôi. Sử dụng NUnit, tôi sẽ thiết lập các phụ thuộc constructor của tôi.

private readonly IMappingEngine _mappingEngine = Mapper.Engine; 

và sau đó trong phương pháp [Setup] của tôi Tôi sẽ tạo bộ điều khiển MVC và gọi lớp AutoMapperConfiguration.

[SetUp] 
public void Setup() 
{ 
    _apiController = new ApiController(_mappingEngine); 
    AutoMapperConfiguration.Configure(); 
} 

mà tôi hiện đã sửa đổi thành.

[SetUp] 
public void Setup() 
{ 
    _apiController = new ApiController(_mappingEngine); 

    Mapper.Initialize(x => 
          { 
           x.AddProfile<ABCMappingProfile>(); 
           x.AddProfile<XYZMappingProfile>(); 
           // etc., etc. 
          }); 
} 

Thật không may, điều này dường như không hoạt động. Các ánh xạ dường như không được chọn như khi tôi nhấn một phương thức sử dụng ánh xạ, AutoMapper ném một ngoại lệ cho biết ánh xạ không tồn tại. Bất kỳ đề xuất về cách/những gì để thay đổi định nghĩa bản đồ/tiêm trong thử nghiệm để giải quyết điều này? Tôi đoán định nghĩa của lĩnh vực IMappingEngine là vấn đề của tôi nhưng không chắc chắn về những lựa chọn tôi có.

Cảm ơn

Trả lời

3

Vấn đề mà bạn có là kết quả của việc sử dụng tĩnh Mapper.Engine đó là một số loại singleton có chứa cấu hình cho AutoMapper. Theo quy ước, không thể thay đổi Mapper.Engine sau khi đã được định cấu hình. Vì vậy, nếu bạn muốn định cấu hình Automapper bằng cách cung cấp AutoMapper.Profiler cho mỗi lần không chuyển tiền, bạn nên tránh sử dụng nó.

Thay đổi khá đơn giản: thêm vào ví dụ của bạn AutoMapperConfiguration ví dụ của riêng nó AutoMapper.MappingEngine thay vì sử dụng static toàn cầu Mapper.Engine.

public class AutoMapperConfiguration 
{ 
    private volatile bool _isMappinginitialized; 
    // now AutoMapperConfiguration contains its own engine instance 
    private MappingEngine _mappingEngine; 

    private void Configure() 
    { 
     var configStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 

     configStore.AddProfile(new ABCMappingProfile()); 
     configStore.AddProfile(new XYZMappingProfile()); 

     _mappingEngine = new MappingEngine(configStore); 

     _isMappinginitialized = true; 
    } 

    /* other methods */ 
} 

ps: full sample is here

+0

Xin lỗi tôi đã không nhận lại cho bạn nêu ra. Tôi chạy một thử nghiệm và Git của bạn không hoạt động, nhưng ngay sau khi tôi cố gắng để kéo động cơ ra như là một tham số constructor những điều đi ra khỏi đường ray. Tôi sẽ quay lại vào tối nay để kiểm tra thêm. – Khepri

+0

Tôi đã xác minh sáng nay rằng là một giải pháp độc lập, git của bạn thực hiện những gì bạn mong đợi. Tuy nhiên, đối với kịch bản của tôi, nơi tôi đang cố gắng để vượt qua một thể hiện của IMappingEngine như một tham số constructor sử dụng Ninject, tôi vẫn không nhận được ánh xạ khởi tạo. Tôi lấy git, và thêm một phương thức để trả về MappingEngine khởi tạo và cố gắng chuyển nó thành một tham số hàm khởi tạo. Kết quả là như nhau. – Khepri

+0

Bạn đã cố gắng thay thế _all_ calls/refences thành 'Mapper' (' Mapper.Initialize', 'Mapper.Engine', v.v.) với phiên bản độc lập mới của' MappingEngine'? – Akim

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