类设计C#命名空间分离

类设计C#命名空间分离,c#,architecture,class-design,C#,Architecture,Class Design,我仍在尝试解决函数分离问题,以及它如何应用于类创建和名称空间包含。我有一个自定义类SoftwareComponent,当它呈现给用户时,它通常会作为列表项出现。创建ToListItem方法是个好主意吗?我之所以担心,是因为我现在在类中放置了一个依赖项,它需要包含System.Web.UI.WebControl命名空间 public ListItem ToListItem() { ListItem li = new ListItem(); li.Te

我仍在尝试解决函数分离问题,以及它如何应用于类创建和名称空间包含。我有一个自定义类SoftwareComponent,当它呈现给用户时,它通常会作为列表项出现。创建ToListItem方法是个好主意吗?我之所以担心,是因为我现在在类中放置了一个依赖项,它需要包含System.Web.UI.WebControl命名空间

    public ListItem ToListItem()
    {
        ListItem li = new ListItem();
        li.Text = ComponentName + " (+" + ComponentCost + ")";
        li.Selected = Selected;

        return li;
    }

我的另一个倾向是基于类本身之外的属性从SoftwareComponent创建ListItem。请提供关于哪种方法更合适/更好的想法。

听起来SoftwareComponent是一个域对象——一个描述应用程序所处世界中“事物”的对象

我尽量避免让这些域对象依赖于域之外的任何东西——这可能是较低级别(如何存储?是否序列化?存储在数据库中)或UI级别

我同意很难做到这一点,通常情况下,您需要管理单独的类层次结构—ui类、数据库映射等等。因此,根据您构建的对象的大小,在域对象中包含UI或数据库代码或将内容隐藏是一种折衷

对于具体的问题,您可以看看C#3.5扩展方法。它们是一种使静态方法看起来像是在类中定义的花招——只要它们不访问私有/受保护的内容(它们只能像任何其他方法一样访问公共方法),您就可以摆脱它们。但是,我将它们用于其他地方定义的您想要做的事情(用于域对象的UI级“方法”)


但是请记住,对于静态类中的好的旧静态方法来说,扩展方法只不过是语法上的糖。

您不能提供这个附加方法作为扩展方法吗?它似乎更适合作为实用程序类的一部分,通过创建提供此功能的静态方法,而不是在主类上作为第一类方法提供此功能,可以将其作为一个选项包括在内

public static class SoftwareComponentExtensions
{
    public static ListItem ToListItem(this SoftwareComponent component)
    {
        ListItem li = new ListItem(component.ComponentName + " (+" + component.ComponentCost + ")");
        li.Selected = component.Selected;

        return li;
    }
}

我不会让SoftwareComponent知道列表项之类的东西。显然,有人必须知道如何将一个SoftwareComponent放入列表项,但我认为这不是SoftwareComponent关心的问题


问问自己,每次需要为另一个UI元素添加一个新的ToXYZ()方法,或者根据它的属性构造一些新类时,是否会添加一个新的ToXYZ()方法。我猜不太可能。

@jeff,我们的回答完全一样。我让路了!:)我总是说我永远不会雇佣我的替身,因为我们会花太多时间争论我们的边际差异。