Здесь происходят некоторые запахи кода.
- StaticClass тесно связан с указанными c типами, от которых он зависит, а не только с их интерфейсами.
- StaticClass определяет срок службы сервисов, которые он использует.
Это не позволяет StaticClass быть полностью тестируемым модулем. Например, вы не можете протестировать поведение StaticClass, не протестировав также и поведение SomeDisposableType.
Я бы почти всегда рекомендовал сделать ваш StaticClass нестатичным c и использовать инжектор конструктора для внедрения сервисов, которые зависят от него. в качестве интерфейсов, что позволяет конфигурации среды Dependency Injection определять время жизни этих объектов.
Если нет веских причин для того, чтобы StaticClass был одноэлементным, просто дайте ему быть временным. Ваша структура DI должна позаботиться о том, чтобы очистить одноразовый материал, который впрыскивается в него.
Если есть , это убедительная причина, чтобы StaticClass был единственным, подумайте очень серьезно о вашем разделении интересов. : StaticClass делает слишком много? Например, возможно, он выполняет некоторую работу по поиску значений, а затем сохраняет эти значения, чтобы избежать повторного выполнения этой работы позже. Или, возможно, он сохраняет состояние определенных свойств вашего приложения и действует на основе этого состояния. В этих случаях вы обычно можете разделить работу по сохранению состояния или запоминанию / кэшированию в отдельном классе, который может быть привязан к одиночке. Тогда ваш сервис, который использует это состояние или кэшированные значения, все еще может быть временным, а его одноразовые зависимости все еще могут быть утилизированы после выполнения заданного задания c.
Если после рассмотрения всего вышеперечисленного вы Вы по-прежнему убеждены, что этот класс должен иметь длительный срок службы, поэтому вам следует тщательно обдумать время существования вашей одноразовой зависимости. Обычно, если класс является одноразовым, это потому, что он поддерживает ресурсы, которые должны время от времени выпускаться. В этом случае вместо непосредственного внедрения этого класса, возможно, вам следует внедрить фабрику, которую вы можете использовать для создания службы по требованию, а затем утилизировать ее, как только действие будет завершено с помощью оператора using
.
Трудно дать более конкретные c рекомендации, не зная больше о ваших конкретных c классах, но я считаю, что эти шаблоны работают лучше всего в подавляющем большинстве случаев.