main
1namespace domain
2{
3 using System;
4 using System.Collections.Generic;
5
6 public interface IComposition
7 {
8 void SplitFor<Commodity>(Percent percent) where Commodity : ICommodity;
9 IQuantity PercentageOf<Commodity>(IQuantity quantity) where Commodity : ICommodity, new();
10 Percent PercentageFor<Commodity>() where Commodity : ICommodity;
11 }
12
13 public class CommoditySplits : IComposition
14 {
15 IDictionary<Type, Percent> splits = new Dictionary<Type, Percent>();
16
17 public void SplitFor<Commodity>(Percent percent) where Commodity : ICommodity
18 {
19 splits[typeof (Commodity)] = percent;
20 }
21
22 public IQuantity PercentageOf<Commodity>(IQuantity quantity) where Commodity : ICommodity, new()
23 {
24 return new Commodity().PercentageFrom(this).Reduce(quantity);
25 }
26
27 public Percent PercentageFor<Commodity>() where Commodity : ICommodity
28 {
29 return splits.ContainsKey(typeof(Commodity)) ? splits[typeof (Commodity)] : Percent.Zero;
30 }
31 }
32}