他の特定のサービスがステータスを報告できるサービスがあります。ステータスとは、実行されているかどうかではなく、データを受信したかどうかを意味します。重要なのは、他のサービスが必要なデータを受信したかどうかを尋ねることができるということです。
これを実装するには、2つの選択肢があります。
1つは次のとおりです。
public interface IDataPrerequisiteFulfillmentService
{
bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites);
void ReportDataPrerequisiteFulfilled(DataPrerequisite dataPrerequisite);
}
ただし、これは、このサービスにレポートする必要があるサービスに追加の依存関係が必要になることを意味します。一部のサービスにはすでに複数の依存関係があり、依存関係を最小限に抑えるのが好きです。
これにアプローチする別の方法は、次のことを行うことです。
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);
}
}
}
私はオプション2を好みます。それはまた依存関係を逆転させます。ただし、IDataPrerequisiteFulfillmentServiceの実装にも入力が必要であるという事実を伝達しないインターフェイスが作成されます。
public bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites)
{
// check _fulFilledPrerequisites here
}
}
実装の動作の半分しか通信しないインターフェースがあっても大丈夫ですか?
実装がどのように機能するかを伝達しないインターフェースを持つことは絶対に問題ありません。実際、これがインターフェースのポイントであり、実装の詳細を非表示にします。
このシナリオでは、2番目のオプションで問題ありません。