Как в общем случае сопоставить модель предметной области с моделью представления?
Я пытаюсь выяснить, как в общем случае сопоставить модель предметной области с моделью представления. Например, с учетом следующих простых объектов и интерфейсов...
// Product
public class Product : IProduct
{
public int ProductID { get; set; }
public string ProductName { get; set; }
}
public interface IProduct
{
int ProductID { get; set; }
string ProductName { get; set; }
}
// ProductPresentationModel
public class ProductPresentationModel : IProductPresentationModel
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public bool DisplayOrHide { get; set; }
}
public interface IProductPresentationModel
{
int ProductID { get; set; }
string ProductName { get; set; }
bool DisplayOrHide { get; set; }
}
Я хотел бы иметь возможность писать код, как это...
MapperObject mapper = new MapperObject();
ProductService service = new ProductService();
ProductPresentationModel model = mapper.Map(service.GetProductByID(productID));
... в котором "MapperObject" может автоматически выяснить, какие свойства отображаются между двумя объектами и какие объекты он отображает, используя что-то вроде отражения, сопоставления на основе соглашений и т. д. Итак, я мог бы тогда так же легко попытаться сопоставлять объекты, такие как UserPresentationModel и User, с одним и тем же MapperObject.
Это возможно? Если так, то как?
РЕДАКТИРОВАТЬ: просто для ясности, вот пример не универсального MapperObject, который я в настоящее время использую:
public class ProductMapper
{
public ProductPresentationModel Map(Product product)
{
var presentationModel = new ProductPresentationModel(new ProductModel())
{
ProductID = product.ProductID,
ProductName = product.ProductName,
ProductDescription = product.ProductDescription,
PricePerMonth = product.PricePerMonth,
ProductCategory = product.ProductCategory,
ProductImagePath = product.ProductImagePath,
ProductActive = product.ProductActive
};
return presentationModel;
}
}
Я все еще пытаюсь понять, как заставить это работать со списком, а не с одним продуктом, но это уже другая тема:)
1 ответ
Я вижу, что ты хочешь. Вы хотите сопоставить свои доменные сущности (Product) с некоторыми объектами DTO (ProductPresentationModel) для связи с вашими клиентами (GUI, внешние службы и т. Д.).
Если у вас есть все эти функции, которые вы ищете, упакованы в AutoMapper Framework.
Вы можете написать так с AutoMapper: Mapper.CreateMap();
посмотрите на эту вики https://github.com/AutoMapper/AutoMapper/wiki/Flattening
Удачи. / С наилучшими пожеланиями Магнус