Временная муфта - это дизайнерский запах, которого не всегда можно избежать. Особенно когда имеешь дело с уже существующими API или иногда с внешними сервисами, которые требуют выполнения операций в определенном (временно связанном) порядке. SqlConnection
- хороший пример, потому что он требует от вас звонить Open
, что является неявным и кое-что, что я до сих пор забываю делать время от времени. С другой стороны, позволить SqlConnection
открывать соединение изнутри его конструктору также является плохой идеей, которая является причиной существования метода Open
в первую очередь.
Но в В большинстве случаев вы можете скрыть сложность API-интерфейсов, связанных во времени, за абстракцией и реализовать эту сложность исключительно внутри реализации адаптера. Это не позволяет остальной части приложения иметь дело с этой временной связью.
Трудно дать очень точную c обратную связь по вашему варианту использования, потому что некоторые детали отсутствуют. Но я могу представить, что StopAPI
до , а не будут частью абстракции и будут вызываться изнутри Dispose
метода на вашем адаптере.
Если порядок взаимодействия имеет решающее значение и невозможно абстрактный, вы можете предотвратить временную связь, позволяя методам возвращать экземпляры, которые должны быть переданы следующему методу для работы. Это делает зависимость между методами очень явной, проверенной компилятором и, следовательно, удаляет временную связь. Например:
public class MyService
{
public MyService(string dataSource);
public Api StartApi();
}
public class Api : IDisposable
{
public Request SendRequest(string request, string pass);
public void Dispose(); // Calls StopAPI internally
}
public class Request : IDisposable
{
public Response Response { get; }
public void Dispose(); // Calls StopRequest internally
}