2015-11-25 1 views
3

J'ai Product, Item1 et Item2 objectif classes.Procédé est de consolider tous les éléments de la classe de produits dans une liste unique afin qu'ils puissent être triés et affichés sur la le site Web du client.Je le veux en C# en utilisant le principe SOLIDEAjouter données multiples classes en classe unique à l'aide modèle de conception solide

public class Product 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 
     public string Type { get; set; } 
    } 
and here are list of datas are in this class 
-- var list1 = new List<Item1>(); 
public class Item1 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 
    } 
-- var list2 = new List<Item2>(); 
public class Item2 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 
    } 

Toute aide serait appréciée. Utilisez un ViewModel pour gérer vos problèmes d'affichage.

+0

Votre question n'est pas très claire. Pouvez-vous expliquer exactement quel est le problème? Vous avez mentionné une classe de base, que voulez-vous dire? –

+0

merci pour votre réponse, j'ai modifié la question –

+0

La question n'est toujours pas claire. quel est le résultat attendu? une 'Liste '? –

Répondre

0

Cela respecte le principe de la responsabilité unique. Les responsabilités du ViewModel sont l'affichage des données et la validation des entrées <form> remplies par l'utilisateur (le cas échéant). Les données à afficher peuvent être agrégées à partir de nombreuses sources.

Utilisez un mappage entre vos entités/entités de domaine/objets de transfert de données persistantes et votre ViewModel. Définissez un mappage de chaque classe source sur votre ViewModel. L'utilisation d'une bibliothèque telle que AutoMapper est fortement recommandée.

Par exemple:

public class ProductDetailsViewModel { 
    // Display attribute as an example of a view concern 
    [Display(Name = "ProductDetails_Name", ResourceType = typeof(Resources))] 
    public string Name {get; set;} 
} 

public class ProductListViewModel { 
    public IEnumerable<ProductDetailsViewModel> ProductDetails {get; set;} 
} 


// Example of mapping by hand: 
var item1 = new Item1(); 
var item2 = new Item2(); 
var vm1 = new ProductDetailsViewModel { Name = item1.Name }; 
var vm2 = new ProductDetailsViewModel { Name = item2.Name }; 
var productList = new ProductListViewModel {ProductDetails = new [] {vm1, vm2}}; 
+0

hey les gars merci pour votre réponse rapide et désolé, je ne peux pas décrire la sortie exacte, je veux comme ça ........ var liste1 = nouvelle Liste (); et var list2 = nouvelle Liste (); et je veux à ces deux liste dans la classe de produit comme ceci var p1 = list1.Select (s => nouveau produit {Id = s.Id}), p1 = list2.Select (s => nouveau produit {Id = s. Id}); et fusionner en une seule liste var finalProduct = p1.Concat (p2) .Tolist(); après cela, je peux appeler finalProduct n'importe où dans le projet, mais je veux que cela utilise un design solide. quelle que soit la prise de clarté supplémentaire, cela n'a pas d'importance, mais le type de retour doit être la liste des classes de produits. thanks –

+0

Vous pouvez définir une interface sur Product, Item1, Item2 qui contient les propriétés communes au Product, par ex. 'interface IProductLike {Guid Id {get; ensemble; } string Nom {get; ensemble; }} ', puis mappez Item1 et Item2 sur Product comme indiqué ci-dessus. L'interface aide à la cohérence. Mais il existe un risque que vous commenciez à mélanger des problèmes dans la classe Product, par ex. si vous devez attribuer les propriétés différemment pour votre OR Mapper, pour WCF et pour les afficher. Par conséquent, un principe de conception commun consiste à séparer frontend et backend en différentes classes. –

0

En supposant que vous voulez remplacer les valeurs du produit ainsi que une liste des objets d'enfants, je suggère que vous déclarez les valeurs que vous souhaitez remplacer comme virtuel, et faire une autre classe disponible qui peut également prendre une liste d'éléments comme requis, tout en héritant de la table de produit parent.

public class Product 
    { 
     public virtual Guid Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string Type { get; set; } 
    } 

    public class ProductFull : Product 
    { 
     public override Guid Id { get; set; } 
     public override string Name { get; set; } 
     public override string Type { get; set; } 

     public List<Item1> Item1s { get; set; } 

     public List<Item2> Item2s { get; set; } 
    } 

    public class Item1 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class Item2 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 
    } 

De MSDN:

propriétés virtuels se comportent comme des méthodes abstraites, à l'exception des différences dans la déclaration et la syntaxe d'invocation. L'utilisation du modificateur virtual sur une propriété statique est une erreur. Une propriété héritée virtuelle peut être substituée dans une classe dérivée en incluant une déclaration de propriété qui utilise le modificateur override.

+0

Oh, à droite, si vos articles ne sont pas destinés à être des collections, supprimez simplement la 'Liste <..>' et remplacez-la par 'Item1' et' Item2'. Utilisez le 'ProductFull' comme modèle à la place. – Eon

+0

hey les gars merci pour votre réponse rapide et désolé, je ne peux pas décrire la sortie exacte, je veux comme ça ........ var list1 = nouvelle Liste (); et var list2 = nouvelle Liste (); et je veux à ces deux liste dans la classe de produit comme ceci var p1 = list1.Select (s => nouveau produit {Id = s.Id}), p1 = list2.Select (s => nouveau produit {Id = s. Id}); et fusionner en une seule liste var finalProduct = p1.Concat (p2) .Tolist(); après cela, je peux appeler finalProduct n'importe où dans le projet, mais je veux que cela utilise un design solide. quelle que soit la prise de clarté supplémentaire, cela n'a pas d'importance, mais le type de retour doit être la liste des classes de produits. merci –