public Currency Currency;
private static Money none = new Money {Amount = 0, Currency = Currency.None};
public static Money None => none;
public static Money Free => none;
public interface IProduct
IProductUse BuildProductUse( Cdr cdr );
public interface IDataContext
public interface IProductUse
void Apply( IDataContext database );
public class PerMBProduct : IProduct
public PerMBProduct( string name, Money costPerMB )
this.costPerMB = costPerMB;
IProductUse IProduct.BuildProductUse( Cdr cdr )
return new Use( this, cdr.Bytes );
private class Use : IProductUse
private readonly PerMBProduct product;
private readonly ulong bytes;
public Use( PerMBProduct product, ulong bytes )
Cost = new Money {Amount = product.costPerMB.Amount * bytes, Currency = product.costPerMB.Currency};
public Money Cost { get; }
public void Apply( IDataContext database )
public class PoolProduct : IProduct
public PoolProduct( string name, ulong size )
IProductUse IProduct.BuildProductUse( Cdr cdr )
if( cdr.Bytes <= this.size )
result = new Use( this, cdr.Bytes );
else if( size <= cdr.Bytes )
result = new Use( this, size );
private class Use : IProductUse
private readonly PoolProduct pool;
private readonly ulong bytes;
public Use( PoolProduct pool, ulong bytes )
public Money Cost => Money.Free;
public void Apply( IDataContext database )
Console.WriteLine("Hello World");