Ho un servizio in cui determinati altri servizi possono segnalare il loro stato. Per stato non intendo se sono in esecuzione o meno, ma se hanno ricevuto dati. Il punto è che altri servizi possono chiedere se i dati di cui hanno bisogno sono stati ricevuti.
Ho due possibili opzioni per implementarlo.
Uno è il seguente:
public interface IDataPrerequisiteFulfillmentService
{
bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites);
void ReportDataPrerequisiteFulfilled(DataPrerequisite dataPrerequisite);
}
Tuttavia, ciò significherebbe che avrei bisogno di una dipendenza extra in qualsiasi servizio che deve segnalare a questo servizio. Alcuni servizi hanno già più dipendenze e mi piace mantenere le dipendenze al minimo.
Un altro modo per avvicinarsi a questo sarebbe quello di fare quanto segue:
public interface IDataPrerequisiteFulfillmentService
{
bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites);
}
public interface IDataPrerequisiteService
{
event EventHandler<DataPrerequisiteEventArgs> PrerequisiteFulfilled;
}
public class DataPrerequisiteFulfillmentService : IDataPrerequisiteFulfillmentService
{
private IList<DataPrerequisite> fulfilledPrerequisites = new List<DataPrerequisite>();
public IDataPrerequisiteFulfillmentService(IEnumerable<IDataPrerequisiteService> services)
{
// receive services via injection
foreach (var service in services)
{
service.PrerequisiteFulfilled += (s, e) =>
{
_fulfilledPrerequisites.Add(e.DataPrerequisite);
}
}
}
Preferisco l'opzione 2. Inverte anche le dipendenze. Tuttavia, rende un'interfaccia che non comunica il fatto che anche l'implementazione di IDataPrerequisiteFulfillmentService avrà bisogno di input.
public bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites)
{
// check _fulFilledPrerequisites here
}
}
Va bene avere un'interfaccia che comunichi solo la metà di come funziona l'implementazione?