使用对象列表在项目的各层之间传递(C#)

时间:2011-10-12 11:42:44

标签: c# oop

在C#(visual Studio 2010)项目中,我有一个包含大量属性的类,并且我使用数据填充此类的对象并添加到列表对象以将其传递给显示项目列表(类似于搜索)。 我的问题在于我不需要类的所有属性来显示上面的列表,所以我是否必须创建另一个类,只显示必需的字段以显示(结果)列表?根据OOP概念,它是否正确?

4 个答案:

答案 0 :(得分:1)

我想是的,它被称为Data transfer object

答案 1 :(得分:1)

您可以考虑使用类似automapper的解决方案从具有N个属性的类映射到具有M个属性的另一个类。它依赖于一些传统信息(相同/相似的名称),但也可以进行调整。

这是一种非常标准的方法,可以从数据库中提取模型数据并将其转换为可以在网页中的视图上显示的内容。我构建了一个“viewmodel”,它只包含我想要显示的内容,通常是字段的子集,然后在它们之间进行映射。像automapper这样的东西很容易实现。

答案 2 :(得分:1)

您的属性对象可以根据程序的不同部分的要求实现多个接口。

如果您定义这些接口:

public interface IBasicInfo
{
    string Name { get; }
    string Id { get; }
}

internal interface IFullInfo : IBasicInfo
{
    string Address { get; }
}

internal interface IInternalStuff
{
    Stuff Data { get; }
}

你的属性类就像这样实现它们:

internal class Properties : IFullInfo, IInternalStuff
{
    // some basic implementation
}

然后,您可以将此课程传递到您的应用的不同部分,该部分的方法如下:

public void Display(IBasicInfo info)
{
   ...
}

调用代码只会看到属于IBasicInfo的属性。请注意,只有IBasicInfo需要公开,甚至Properties类都是内部,以确保没有调用代码可以转换回实际的实现并弄乱它。 / p>

或者,如果您的调用代码包含完全不同的接口,那么将它们转换为数据传输对象,甚至修改其内容以匹配调用者的期望(适配器模式)是完全合理的。有些工具可以自动执行此任务(例如Automapper)。

答案 3 :(得分:0)

由于您有一个引用类型(一个类),传递原始对象而不是包含数据子集的新对象的成本应该不高。

如果要保护对象不被列表的接收者操纵,那么您可以为该类定义一个只读接口,并将其作为该接口传递。