2011-08-13 2 views
0

J'essaie de comprendre comment mapper génériquement un modèle de domaine à un modèle de présentation. Par exemple, étant donné les objets simples suivants et interfaces ...Comment mapper génériquement un modèle de domaine à un modèle de présentation?

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

Je voudrais être en mesure d'écrire du code comme ça ...

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

... dans lequel le « MapperObject » pourrait automatiquement déterminer quelles propriétés sont mappées sur les deux objets et quel type d'objets est mappé en utilisant quelque chose comme la réflexion, le mappage basé sur les conventions, etc. Ainsi, je pourrais tout aussi bien essayer de mapper des objets comme UserPresentationModel et User avec le même MapperObject.

Est-ce possible? Si c'est le cas, comment?

EDIT: Par souci de clarté, voici un exemple d'un MapperObject non-générique que je suis actuellement en utilisant:

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

J'essaye toujours de trouver comment obtenir ce travail avec la liste, au lieu d'un seul produit, mais c'est un sujet différent :)

Répondre

1

Je vois ce que vous voulez. Vous souhaitez mapper vos entités de domaine (produit) à un type d'objet DTO (ProductPresentationModel) pour la communication avec vos clients (interface graphique, services externes, etc.).

Vous avez toutes ces fonctionnalités que vous cherchez dans le framework AutoMapper. Vous pouvez écrire comme ceci avec AutoMapper: Mapper.CreateMap();

regard sur ce wiki https://github.com/AutoMapper/AutoMapper/wiki/Flattening

Bonne chance. /Cordialement Magnus

Questions connexes