static void Main(string[] args)
        {
            //setup our DI
            var serviceProvider = new ServiceCollection()
                                  .AddScoped(typeof(IClockReader), typeof(Clock))
                                  .AddScoped(typeof(IEnviosRepository), typeof(EnviosRepository))
                                  .AddScoped <IPackageRepository, EnvioPackageRepositoryAdapter>(x => {
                EnvioPackageRepositoryAdapter envioPackageRepositoryAdapter =
                    new EnvioPackageRepositoryAdapter(x.GetRequiredService <IEnviosRepository>());
                envioPackageRepositoryAdapter.AddFactory(new EstafetaEnviosFactory(new Estafeta()));
                envioPackageRepositoryAdapter.AddFactory(new FedexEnviosFactory(new Fedex()));
                envioPackageRepositoryAdapter.AddFactory(new DhlEnviosFactory(new Dhl()));
                return(envioPackageRepositoryAdapter);
            })
                                  .AddScoped(typeof(IRangoDeTiempoProvider), typeof(RangoDeTiempoProvider))
                                  .AddScoped(typeof(ITimeChecker), typeof(TimeChecker))
                                  .AddScoped(typeof(ICalculadorTiempoTraslado), typeof(CalculadorTiempoTraslado))
                                  .AddScoped(typeof(ICalculadorDeFechaDeEntrega), typeof(DefaultCalculadorFechaEntrega))
                                  .AddScoped(typeof(ICalculadorCostoEnvio), typeof(CalculadorCostoEnvio))
                                  .AddScoped(typeof(IDeliveryManager), typeof(DeliveryManager))
                                  .AddScoped(typeof(IDeliveryMessagePrinter), typeof(DeliveryMessagePrinter))
                                  .AddScoped(typeof(IReporteadorDePedidos), typeof(ReporteadorDePedidos))
                                  .BuildServiceProvider();
            IReporteadorDePedidos  reporteadorDePedidos  = serviceProvider.GetRequiredService <IReporteadorDePedidos>();
            IRangoDeTiempoProvider rangoDeTiempoProvider = serviceProvider.GetRequiredService <IRangoDeTiempoProvider>();
            ICalculadorCostoEnvio  calculadorCostoEnvio  = serviceProvider.GetRequiredService <ICalculadorCostoEnvio>();

            //Empresas
            Estafeta estafeta = new Estafeta();
            Fedex    fedex    = new Fedex();
            Dhl      dhl      = new Dhl();



            reporteadorDePedidos.AddEmpresa(estafeta);
            reporteadorDePedidos.AddEmpresa(fedex);
            reporteadorDePedidos.AddEmpresa(dhl);
            reporteadorDePedidos.AddStrategy(
                PackageStatus.entregado,
                new EntregadoStrategy(rangoDeTiempoProvider, calculadorCostoEnvio));
            reporteadorDePedidos.AddStrategy(
                PackageStatus.enCamino,
                new PorEntregarStrategy(rangoDeTiempoProvider, calculadorCostoEnvio));
            reporteadorDePedidos.AddStrategy(PackageStatus.unknown, new UnsupportedMetodoEnvioStrategy());
            reporteadorDePedidos.AddStrategy(PackageStatus.unsupported, new EmpresaDesconocidaStrategy());

            RecomendacionReporteadorPedidosDecorator recomendacionReporteadorPedidosDecorator =
                new RecomendacionReporteadorPedidosDecorator(reporteadorDePedidos, serviceProvider.GetRequiredService <IPackageRepository>(), serviceProvider.GetRequiredService <ICalculadorCostoEnvio>());

            recomendacionReporteadorPedidosDecorator.AddEmpresa(estafeta);
            recomendacionReporteadorPedidosDecorator.AddEmpresa(fedex);
            recomendacionReporteadorPedidosDecorator.AddEmpresa(dhl);
            recomendacionReporteadorPedidosDecorator.AddStrategy(
                PackageStatus.entregado,
                new EntregadoStrategy(rangoDeTiempoProvider, calculadorCostoEnvio));
            recomendacionReporteadorPedidosDecorator.AddStrategy(
                PackageStatus.enCamino,
                new PorEntregarStrategy(rangoDeTiempoProvider, calculadorCostoEnvio));
            recomendacionReporteadorPedidosDecorator.AddStrategy(PackageStatus.unknown, new UnsupportedMetodoEnvioStrategy());
            recomendacionReporteadorPedidosDecorator.AddStrategy(PackageStatus.unsupported, new EmpresaDesconocidaStrategy());

            recomendacionReporteadorPedidosDecorator.ReportAll();
        }
Example #2
0
 public Maritimo(IObtenerVelocidadVariacion obtenerVelocidadVariacion, ICalculadorCostoEnvio calculadorCostoEnvio)
 {
     this.obtenerVelocidadVariacion = obtenerVelocidadVariacion;
     this.calculadorCostoEnvio      = calculadorCostoEnvio; //costo envio
 }
Example #3
0
 public PedidoService(ICalculadorCostoEnvio calculadorCostoEnvio, ICalculadorFechaEntrega calculadorFechaEntrega, ICalculadorTiempoTraslado caculadorTiempoTraslado)
 {
     _calculadorCostoEnvio     = calculadorCostoEnvio;
     _calculadorFechaEntrega   = calculadorFechaEntrega;
     _calculadorTiempoTraslado = caculadorTiempoTraslado;
 }
Example #4
0
 public Terrestre(ICalculadorCostoEnvio calculadorCostoEnvio, ICalculadorTiempoTraslado calculadorTiempoTraslado)
 {
     this.calculadorTiempoTraslado = calculadorTiempoTraslado;
     this.calculadorCostoEnvio     = calculadorCostoEnvio; //costo envio
 }
Example #5
0
 public PorEntregarStrategy(IRangoDeTiempoProvider rangoDeTiempoProvider, ICalculadorCostoEnvio calculadorCostoEnvio)
 {
     _rangoDeTiempoProvider = rangoDeTiempoProvider;
     _calculadorCostoEnvio  = calculadorCostoEnvio;
 }
 public RecomendacionReporteadorPedidosDecorator(IReporteadorDePedidos principal, IPackageRepository packageRepository, ICalculadorCostoEnvio calculadorCostoEnvio)
 {
     _principal            = principal;
     _packageRepository    = packageRepository;
     _calculadorCostoEnvio = calculadorCostoEnvio;
 }