/// <summary> /// Programa una tarea /// </summary> /// <param name="id"></param> /// <param name="tarea"></param> /// <param name="tarea"></param> /// <param name="tipoTarea"></param> /// <param name="procesosIncompatibles">Coleccion de IDs de tareas incompatibles</param> void ProgramaTarea(string id, ITarea tarea, Type tipoTarea, IProgramador programacion, IEnumerable <string> procesosIncompatibles = null) { if ((tarea == null && tipoTarea == null) || programacion == null) { throw new ArgumentException("La tarea y la programación deben especificarse"); } if (tarea != null && tipoTarea != null) { throw new ArgumentException("Solo se puede especificar la tarea o su tipo"); } if (tipoTarea != null && container == null) { throw new ArgumentException($"El contenedor es nulo y la tarea tipo {tipoTarea.Name} lo necesita"); } if (tipoTarea != null && container.GetRegistration(tipoTarea) == null) { throw new ArgumentException($"El contenedor no conoce a {tipoTarea.Name}"); } if (string.IsNullOrWhiteSpace(id)) { throw new ArgumentException($"La tarea debe tener un Id unico"); } log.Info($"Programando tarea {id} con el programador {programacion.GetType()}"); DateTime primeraEjecucion = programacion.PrimeraEjecucion(DateTime.Now); if (primeraEjecucion < DateTime.Now.AddSeconds(-5)) { log.Warn($"La tarea {id} ha caducado antes de iniciarse"); return; } log.Info($"Servicio periodico registrado {id} en fecha {primeraEjecucion:g}"); TareaProgramada prog = new TareaProgramada(); prog.ID = id; prog.Programacion = programacion; prog.Tarea = tarea; prog.TipoTarea = tipoTarea; prog.SiguienteInicio = primeraEjecucion; if (procesosIncompatibles != null) { prog.ProcesosIncompatibles.AddRange(procesosIncompatibles); } lock (bloqueo) { if (tareasProgramadas.Where(x => x.ID == id).FirstOrDefault() != null) { log.Warn($"La tarea {id} está duplicada"); return; } tareasProgramadas.Add(prog); } EscaneaTareas(); }
public void DesenvolverSistema(IProgramador programador, IEnumerable <Especificacao> specs) { // Devido à violação do princípio de Liskov, se passarmos um "AnalistaVelhaco" aqui será lançada uma exception // pois ele não cumpre funcionalmente o contrato de desenvolvedor, já que lança exceção quando pedem pra ele desenvolver. specs .ToList() .ForEach(spec => programador.Code(spec, new[] { new Coffee() })); }
public void DesenvolverSistema(IProgramador programador, IEnumerable <Especificacao> specs) { // Nesse caso como o "AnalistaAntigoProgramadorDelphi" também sabe cumprir a função de desenvolvedor como era esperado, // podemos passar a spec e uma xícara de café para ele que ele dá conta de realizar o trabalho, novamente, como era esperado. specs .ToList() .ForEach(spec => programador.Code(spec, new[] { new Coffee() })); }
public void ReceberProgramador(IProgramador programador) { programador.Programar(); }
/// <summary> /// Programa una tarea /// </summary> /// <param name="id"></param> /// <param name="funTarea"></param> /// <param name="programacion"></param> /// <param name="descripcion"></param> public void ProgramaTarea(string id, Func <CancellationToken, Task> funTarea, IProgramador programacion, IEnumerable <string> procesosIncompatibles = null) { ProgramaTarea(id, new TareaFuncion(funTarea), programacion, procesosIncompatibles); }
/// <summary> /// Programa una tarea /// </summary> /// <param name="id"></param> /// <param name="programacion"></param> /// <param name="procesosIncompatibles">Coleccion de IDs de tareas incompatibles</param> public void ProgramaTarea <T>(string id, IProgramador programacion, IEnumerable <string> procesosIncompatibles = null) { ProgramaTarea(id, null, typeof(T), programacion, procesosIncompatibles); }
/// <summary> /// Programa una tarea /// </summary> /// <param name="id"></param> /// <param name="tipoTarea"></param> /// <param name="programacion"></param> /// <param name="procesosIncompatibles">Coleccion de IDs de tareas incompatibles</param> public void ProgramaTarea(string id, Type tipoTarea, IProgramador programacion, IEnumerable <string> procesosIncompatibles = null) { ProgramaTarea(id, null, tipoTarea, programacion, procesosIncompatibles); }