Обработка iDisposable в неудачном инициализаторе или конструкторе

Есть ли какой-нибудь хороший шаблон в .Net для обеспечения того, чтобы поля iDisposable, принадлежащие объекту, были удалены, если во время построения возникнет исключение, возможно во время инициализатора поля? Единственный способ окружить инициализаторы полей в блоке Try / Catch - это если блок находится вне вызова конструктора, что затруднит правильное удаление чего-либо из кода очистки.

Единственный подход, который я могу представить, будет быть объектом, унаследованным от базового класса, конструктор которого принимает что-то вроде массива iDisposable и устанавливает первый элемент в этом массиве, указывающий на себя. Все конструкторы дочерних классов должны быть закрытыми или защищенными и включать этот параметр. Создание экземпляров должно осуществляться с помощью заводских методов, которые объявляют массив из одного iDisposable и передают его соответствующему конструктору. Если конструктор не работает, фабричный метод будет иметь ссылку на частично построенный объект, который он затем может удалить (метод dispose, конечно, должен будьте готовы принять возможность того, что объект может быть построен не полностью).

Подход можно расширить, если у объекта будет храниться список объектов iDisposable, которые он создает, чтобы позволить очистить объекты без необходимости явного удаления каждый; такой список был бы полезен в сочетании с подходом factory-method-calls-dispose, но в значительной степени ортогонален ему.

Есть какие-нибудь мысли?

6
задан supercat 29 September 2010 в 19:26
поделиться