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}