Poderia retornar o próximo tipo ao invés de fazer essa ligação no desconto? E na classe CalculadorDeDesconto teria um while por exemplo, enquanto próximo tipo for diferente de null tenta aplicar o desconto.
Algo do tipo
public class Orcamento
{
public double Valor { get; private set; }
public double ValorDesconto { get; private set; }
public IList<Item> Itens { get; private set; }
public Orcamento(double valor)
{
this.Valor = valor;
this.Itens = new List<Item>();
}
public void AdicionaItem(Item item)
{
Itens.Add(item);
}
public void AplicaDesconto(double valor)
{
this.ValorDesconto = valor;
this.Valor = Valor - ValorDesconto;
}
}
public interface IDesconto
{
IDesconto Desconta(Orcamento orcamento);
}
public class DescontoPorCincoItens : IDesconto
{
public IDesconto Desconta(Orcamento orcamento)
{
if (orcamento.Itens.Count > 5)
orcamento.AplicarDesconto(orcamento.Valor * 0.1);
return typeof(DescontoPorMaisDeQuinhentosReais);
}
}
public class DescontoPorMaisDeQuinhentosReais : IDesconto
{
public IDesconto Desconta(Orcamento orcamento)
{
if (orcamento.Valor > 500.0)
orcamento.AplicarDesconto(orcamento.Valor * 0.1);
return null;
}
}
public class CalculadorDeDesconto
{
public double Calcula(Orcamento orcamento)
{
IDesconto proximo = new DescontoPorCincoItens().Desconta(orcamento);
while (proximo != null)
{
var desconto = // Buscar classe da injeção de dependencia
proximo = desconto.Desconta(orcamento);
}
}
}