CSLA,BusinessCollectionBase和ITypedList

时间:2011-03-31 14:11:15

标签: winforms data-binding collections csla

我正在为一个使用以.NET 2.0 CSLA为模型的业务对象的客户端开发一个大型Winforms项目。升级到较新版本的CSLA不是一种选择。我的客户端使用CodeSmith从数据库表生成“基本”CSLA样式的业务对象。所有业务对象都带有相应的“List”类。

我遇到的一个问题是绑定到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的{​​{1}}类,则我的扩展类不能从ITypedList继承,并且在上面的示例中,ListExtensionBase。如果我使用泛型参数创建基类,则会失去对所有基类成员的直接访问权限。我无法控制如何生成SomeItemListBase并且已被指示按原样使用其业务对象框架。有没有什么方法可以在每个List扩展中使用相同的代码实现SomeItemListBase?我是否应该为每个实现使用相同的代码,或者每个扩展的ITypedList实现是否应该不同?

1 个答案:

答案 0 :(得分:0)

如果无法修改基类,我认为你坚持在每个列表类上单独实现ITypedList