.NET рефакторинг, СУХОЙ. двойное наследование, доступ к данным и разделение интересов

Предыстория:

Итак, я застрял в архитектурной проблеме за последние пару ночей на рефакторе, с которым я играл. Ничего важного, но это беспокоит меня. Это на самом деле упражнение в DRY , и попытка довести его до такой степени, что архитектура DAL полностью DRY. Это полностью философское / теоретическое упражнение.

Код частично основан на одном из рефакторингов @JohnMacIntyre , о которых я недавно убедил его написать в блоге на http: // whileicompile.wordpress .com / 2010/08/24 / мой-чистый код-опыт-не-1 / . Я немного изменил код, как обычно, для того, чтобы продвинуть код на один уровень дальше - обычно просто для того, чтобы увидеть, какой дополнительный пробег я могу извлечь из концепции ... в любом случае, мои причины в значительной степени не имеют значения.

Часть моего уровня доступа к данным основана на следующей архитектуре:

abstract public class AppCommandBase : IDisposable { }

Это содержит базовые вещи, такие как создание объекта команды и очистка после удаления AppCommand. Все мои объекты базы команд являются производными от этого.

abstract public class ReadCommandBase : AppCommandBase

Это содержит основные вещи, которые влияют на все команды чтения - особенно в этом случае, чтение данных из таблиц и представлений. Без редактирования, без обновления, без сохранения.

abstract public class ReadItemCommandBase : ReadCommandBase { }

Это содержит некоторые более базовые общие вещи, такие как определение методов, которые потребуются для чтения одного элемента из таблицы в базе данных, где имя таблицы, Я думал о переносе их в вспомогательный класс, но хотя это может централизовать содержимое членов в одном месте, у меня все равно будут идентичные члены в каждом из классов, которые вместо этого указывают на вспомогательный класс, который мне все еще не нравится.

Моя первая мысль о том, что двойное наследование может решить эту проблему, хотя я согласен, что двойное наследование обычно является запахом кода, но это решило бы эту проблему очень элегантно. Итак, учитывая, что .NET не поддерживает двойное наследование, куда мне идти отсюда?

Возможно, другой рефакторинг был бы более подходящим ... но у меня возникают проблемы, когда я пытаюсь обойти эту проблему.

Если кому-то нужна полная база кода, чтобы увидеть, о чем я пишу, у меня есть прототип решения на моем DropBox по адресу http: //dl.dropbox. ком / U / 3029830 / Прототипы / Прототип% 20-% 20DAL% 20Refactor.zip . Код, о котором идет речь, находится в проекте DataAccessLayer.

PS Это не часть текущего активного проекта, это скорее головоломка рефакторинга для моего собственного развлечения.

Заранее спасибо, ребята, я ценю это.

5
задан John MacIntyre 27 August 2010 в 03:41
поделиться