如何将领域模型一般性地映射到表示模型?

发布于 2024-11-29 08:12:04 字数 2010 浏览 2 评论 0原文

我试图弄清楚如何将域模型一般映射到表示模型。例如,给定以下简单的对象和接口......

// 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”可以自动找出哪些属性映射到两个对象以及什么类型它使用反射、基于约定的映射等映射对象。因此,我可以轻松地尝试使用相同的 MapperObject 映射 UserPresentationModel 和 User 等对象。

这可能吗?如果是这样,怎么办?

编辑:为了清楚起见,这里是我当前正在使用的非通用 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;
    }
}

我仍在尝试弄清楚如何让它与列表一起使用,而不仅仅是单个产品,但这是一个不同的主题:)

I am trying to figure out how to generically map a domain model to a presentation model. For example, given the following simple objects and interfaces ...

// 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; }
}

I would like to be able to write code like this ...

MapperObject mapper = new MapperObject();
ProductService service = new ProductService();
ProductPresentationModel model = mapper.Map(service.GetProductByID(productID));

... in which the "MapperObject" could automatically figure out which properties map across the two objects and what sort of objects it is mapping using something like reflection, convention-based mapping, etc. So, I could then just as easily try to map objects like UserPresentationModel and User with the same MapperObject.

Is this possible? If so, how?

EDIT: Just for clarity, here is an example of a non-generic MapperObject that I am currently using:

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;
    }
}

I am still trying to work out how to get this to work with List, instead of just a single Product, but that's a different topic :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

书间行客 2024-12-06 08:12:04

我看到你想要的。您希望将域实体(产品)映射到某种类型的 DTO 对象(ProductPresentationModel),以便与客户端(GUI、外部服务等)进行通信。

我已经将您正在寻找的所有功能都打包到 AutoMapper 框架中了。

使用 AutoMapper 可以这样写:
Mapper.CreateMap();

看看这个wiki https://github.com/AutoMapper/AutoMapper/wiki/Flattening

祝你好运。
/最诚挚的问候马格努斯

I see want you want. You want to map your domain entities (Product) to aome kind of DTO object (ProductPresentationModel) for communication with your clients (GUI, external services etc).

I you have all this functionality you're looking for packed into AutoMapper framework.

You can write like this with AutoMapper:
Mapper.CreateMap();

look at this wiki https://github.com/AutoMapper/AutoMapper/wiki/Flattening

Good luck.
/Best Regards Magnus

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文