I notified a problem on their queries classes that can become a big problem in time, if you want to sell this solution as a platform. Also, from some perspective, these problems also violate the CQRS principle.
Let’s see some code now:
public class Order
{
Collection<OrderItem> _items;
public IEnumerable<OrderItem> Items
{
get
{
return _items;
}
}
...
}
What do you see here strange? We want to expose the OrderItem collection as a read only collection. To do this, we convert it to IEnumerable. Hmmm… sounds good? Nope. Big mistake! Nobody stop us to convert the Items back to an ICollection and Add/Remove items from it.
Order order = new Order();
…
var orderItems = (Collection<OrderItem>)oder.Items;
What should we do? .NET framework has specials collections that can be used in these situations. I this case we should use IReadOnlyCollection<T>. This class will let the user to access items but he will not be able to modify the list (add or remove items from the collection).To obtain the list as a read only collection we will need to use the AsReadOnly() method:
public class Order
{
Collection<OrderItem> _items;
public IReadOnlyCollection<OrderItem> Items
{
get
{
return _items. AsReadOnly();
}
}
...
}
Under the hood, this method will create a new collection that point to our original items.When expose items as “read-only”, you should always double check. There are many methods that permit us to cast items.
0 comments:
Post a Comment