CSLA, BusinessCollectionBase и ITypedList - PullRequest
       22

CSLA, BusinessCollectionBase и ITypedList

0 голосов
/ 31 марта 2011

Я работаю над большим проектом 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 должны быть разными для каждого расширения?

1 Ответ

0 голосов
/ 06 апреля 2011

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

...