Я работаю над большим проектом Winforms для клиента, который использует бизнес-объекты, смоделированные до .NET 2.0 CSLA.Обновление до более новой версии CSLA не вариант.Мой клиент использует CodeSmith для генерации «базовых» бизнес-объектов в стиле CSLA из таблиц базы данных.Все бизнес-объекты имеют соответствующий класс «Список».
Одной из проблем, с которыми я столкнулся, является привязка к элементам управления Winforms, поскольку сгенерированные классы List не реализуют ITypedList
.Клиент сказал мне, что я могу расширить классы List и реализовать его самостоятельно (они предоставили фрагмент кода ниже), но я имею дело с довольно многими бизнес-объектами и нарушаю DRY каждый раз, когда я расширяю один из списка.классы для реализации ITypedList
.Я использую следующий код в каждом расширенном классе List:
public class SomeItemListExtended : SomeItemListBase, ITypedList
{
public string GetListName(PropertyDescriptor[] listAccessors)
{
return null;
}
public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
{
return TypeDescriptor.GetProperties(CreateContent().GetType());
}
}
CreateContent
просто возвращает новый экземпляр элемента, из которого List является коллекцией:
public BusinessBase CreateContent()
{
return new SomeItem();
}
Я пытался выяснить, есть ли способ, которым я могу использовать наследование, чтобы избежать дублирования одного и того же кода в каждом расширении класса List, но не выяснил, как это сделать без множественного наследования, что, как мы все знаем, не являетсявозможно в любом случае.Если я создаю класс ListExtensionBase
, который реализует ITypedList
, мои классы расширений не могут наследоваться как от ListExtensionBase
, так и, как в примере выше, SomeItemListBase
.Если я создаю базовый класс с универсальным параметром, я теряю прямой доступ ко всем членам базового класса.У меня нет контроля над тем, как генерируется SomeItemListBase
, и я получил инструкции использовать их инфраструктуру бизнес-объектов как есть.Можно ли как-нибудь реализовать ITypedList
с одним и тем же кодом в каждом расширении List?Должен ли я даже использовать один и тот же код для каждой реализации или реализации ITypedList
должны быть разными для каждого расширения?