Dưới đây là cách tôi giải quyết nó:
tôi định nghĩa một giao diện IMappingCreator
:
public interface IMappingCreator
{
void CreateMappings();
}
tôi đã đi trước và thực hiện một lớp học với giao diện mà (Tôi đang sử dụng MEF như DI container, đó là nơi các thuộc tính được đến từ) được đưa vào container DI như IMappingCreator
:
[Export(typeof(IMappingCreator))]
public class Mapping : IMappingCreator
{
private readonly IRefTypesLookup iRefTypesLookup;
[ImportingConstructor]
public Mapping(IRefTypesLookup rtl)
{
iRefTypesLookup = rtl;
}
public void CreateMappings()
{
Mapper.CreateMap<Journal, DisplayJournal>().AfterMap((j, dj) => dj.RefTypeName = iRefTypesLookup.Lookup(j.RefTypeID));
}
}
Cuối cùng, trong khi khởi động ứng dụng của tôi, tôi lấy tất cả instanc es của giao diện mà trong container và gọi phương thức CreateMappings
trên chúng:
var mappings = container.GetExportedValues<IMappingCreator>();
foreach (IMappingCreator mc in mappings)
{
mc.CreateMappings();
}
Điều này làm cho các thiết lập ban đầu khá dễ dàng, như tất cả các sáng tạo xảy ra ở một nơi, và bạn có thể có nhiều người sáng tạo lập bản đồ theo ý muốn (tuy nhiên, bạn nên giữ chúng ở mức tối thiểu, có thể một lần cho mỗi dự án hoặc như vậy, lấy tất cả các dịch vụ cần thiết để ánh xạ các loại cụ thể trong dự án đó).
Lý do duy nhất tôi có thể nghĩ là không hoàn toàn là tổ chức. Bạn sẽ có khả năng có mã bản đồ trên tất cả (các) dự án của bạn. Nếu đối tượng miền của bạn thay đổi hoặc dtos có thể ít hơn lý tưởng. Nhưng tôi tò mò muốn tìm hiểu ý kiến của người khác. – Daniel
Vâng, tôi vẫn sẽ giữ mã bản đồ ở một nơi - tức là.lớp đó, sẽ lấy tất cả các dịch vụ cần thiết từ thùng chứa DI. Tôi chỉ cần phải khởi tạo bản đồ bản thân thay vì có thể dựa vào các nhà xây dựng tĩnh thực hiện nó tự động. – Femaref
Đối với phiên bản mới nhất, hãy xem [this] (http://stackoverflow.com/a/35431096/1977871) để trả lời – VivekDev