2011-07-28 5 views
-1

Si j'ai un objet agrégé, par ex. Order -> OrderLine où mon objet Order est identifié comme la racine agrégée, donc pour ajouter OrderLine à l'Order, je m'attendrais à le faire à travers la racine agrégée et par aucun autre moyen, par exemple. Order.AddOrderLine (ligne OrderLine). L'objet Order expose évidemment une collection de lignes de commande, mais comment empêcher les consommateurs utilisant directement cette collection d'ajouter des lignes de commande, je suppose que la réponse est d'utiliser une collection Readonly? Est-ce que cela empêche les consommateurs de changer l'état des objets, c'est-à-dire les lignes de commande dans la collection?Utilisation des collections C#

Merci

+0

Pouvez-vous poster le code? –

+3

Être dans une collection Readonly n'empêche pas les consommateurs de changer les objets à l'intérieur. –

+0

Pourquoi ne voudriez-vous pas que les gens ajoutent des commandes directement? –

Répondre

5

Exposez votre OrderLines comme IEnumerable < OrderLine> et mettre en œuvre Ajout/Suppression de méthodes si nécessaire. De cette façon, vos clients peuvent seulement itérer sur la collection, pas la manipuler sans passer par votre agrégat.

+0

Spot sur! Merci beaucoup. – David

0

Le fait de marquer une collection avec le mot-clé readonly empêchera simplement la réaffectation de la référence de collection, mais n'empêchera pas de modifier le contenu de la collection.

Vous pouvez cependant utiliser la méthode List (T) .AsReadOnly pour renvoyer une instance ReadOnlyCollection, qui ressemble à ce que vous voulez.

http://msdn.microsoft.com/en-us/library/e78dcd75.aspx

0

Si vous ne voulez pas exposer votre OrderLine objets que vous devriez penser à une autre façon de passer une ligne de commande à votre commande, par exemple ne soumettre que des méta-informations dans une classe séparée comme dans mon exemple ci-dessous:

/// <summary> 
/// Represents an order, order lines are not accessible by other classes 
/// </summary> 
public class Order 
{ 
    private readonly List<OrderLine> _orderLines = new List<OrderLine>(); 

    public void AddOrderLineFromProperties(OrderLineProperties properties) 
    { 
     _orderLines.Add(properties.CreateOrderLine()); 
    } 
} 

/// <summary> 
/// Class which contains orderline information, before it is 
/// "turned into a real orderline" 
/// </summary> 
public class OrderLineProperties 
{ 
    public OrderLine CreateOrderLine() 
    { 
     return new OrderLine(); 
    } 
} 

/// <summary> 
/// the concrete order line 
/// </summary> 
public class OrderLine 
{ 

} 
Questions connexes