Работа с коллекциями C # - PullRequest
0 голосов
/ 28 июля 2011

Если у меня есть агрегатный объект, например, Order -> OrderLine, где мой объект Order идентифицирован как агрегированный корень, следовательно, чтобы добавить OrderLine к Order, я ожидал бы сделать это через агрегатный корень и никакими другими способами, например Order.AddOrderLine (строка OrderLine).

Объект Order, очевидно, предоставляет коллекцию OrderLines, но как я могу запретить потребителям использовать эту коллекцию напрямую для добавления OrderLines, я предполагаю, что ответ заключается в использовании коллекции Readonly ??Остановит ли это потребителей изменение состояния объектов, т. Е. OrderLines в коллекции?

Спасибо

Ответы [ 3 ]

5 голосов
/ 28 июля 2011

Представьте ваши orderLines как IEnumerable и реализуйте методы Add / Remove по мере необходимости. Таким образом, ваши клиенты могут только перебирать коллекцию, а не манипулировать ею без прохождения через ваш агрегат.

0 голосов
/ 28 июля 2011

Если вы не хотите предоставлять свои объекты OrderLine, вам следует подумать о другом способе передачи OrderLine в ваш Order, например, отправке только мета-информации в отдельный класс, как в моем примере ниже:

/// <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
{

}
0 голосов
/ 28 июля 2011

Пометка коллекции с помощью ключевого слова readonly только предотвратит переназначение ссылки на коллекцию, но не предотвратит изменение содержимого коллекции.

Вы можете использовать метод List (T) .AsReadOnly, чтобы вернуть экземпляр ReadOnlyCollection, что звучит так, как вы хотите.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...