2

问题是 - 使用当前上下文或场景所需的附加数据扩展某些对象的最佳方法是什么。

例如,我有 Product 类,它具有基本(核心)属性,如 ID、名称和价格。产品实例主要用作业务层操作的输入/输出,也用于在其他应用层之间传递信息。

例如,当我需要在 GUI 中列出带有一些扩展信息(如制造商、制造商、一些计算值等)的产品时,我通常会创建返回一组行的 SP,然后我需要存储这些附加数据在项目实例中。我不想使用这些附加属性中的每一个来扩展 Product 类(类最终会变得沉重和不优雅,缺少主要功能),我也不想将 Product 子类化以添加新属性(这会在某些情况下增加复杂性) .

我的想法是放置一个或多个复杂属性(存储对象及其属性),这些属性将存储用于各种场景的附加数据,但我不确定这是一个好的解决方案。

你有什么建议?

4

4 回答 4

2

听起来您遇到了模型与视图模型的问题。ViewModel 仅用于显示目的,因此拥有具有额外属性的视图模型并将模型映射到 UI 级别的视图模型是一种有效的设计。

于 2012-06-07T20:37:46.567 回答
1

您可能会考虑构建两个类。一个,称为ProductSummary,将包含一些产品数据的只读表示:

public class ProductSummary
{
    public int Id { get; }
    public string Name { get; }
    public double Price { get; }
}

第二个类,称为ProductDetail,将包含所有产品数据的读写表示:

public class ProductDetail
{
    public int Id { get; }
    public string Name { get; set; }
    public double Price { get; set; }
    public string Manufacturer { get; set; }

    private ProductDetail()
    {
    }

    public double ComputeValue()
    {
    }

    public static ProductDetail(ProductSummary summary)
    {
        var newProduct = new ProductDetail();
        // load Product data using primary key from summary.Id      
        // populate newProduct from loaded data
        return newProduct;
    }
}

该类ProuctSummary最终成为关键产品信息的轻量级只读容器。数据集合ProductSummary可用于填充列表等。

一旦需要编辑产品,您可以使用ProductSummary对象中的 ID 来加载较重的ProductDetail类,您可以将其用于编辑场景。

这似乎是多余的工作,但请考虑应为特定用例设计类。如果您有一个轻量级只读摘要类的用途,以及一个可编辑类的单独用例,那么您可能需要考虑两个单独的类。

于 2012-06-07T20:51:06.343 回答
0

我个人会扩展课程,但您也可以按照以下方式做一些事情:

public class Product
{
    ...

    public List<ProductProperty> AdditionalProperties { get; set; }
}

class ProductProperty
{
    public string Name { get; set; }
    public object Data { get; set; }
}

请记住,绝对不是最佳实践;)

于 2012-06-07T20:40:02.757 回答
0

所以......如果我理解这个正确性:

  • 您不想将产品类扩展为继承“产品”的子类
  • 您不想将所有额外的“情境”属性添加到 Product 类本身

鉴于此,您正在寻找一种根据情况向对象添加临时属性的方法?

我会为“自定义属性”推荐一个标准的简单 HashTable 扩展。

private HashTable CustomProperties { get; set; }

//Note: all three of these functions are unecessary if you make the hashtable public, but they do look good as far as an interface goes.
public void AddCustomProperty (String key, Object value)
{
    CustomProperties.Add(key, value);
}

public void RemoveCustomProperty (String key)
{
    CustomProperties.Remove(key);
}

public object GetCustomProperty (String key)
{
    return CustomProperties[key];
}

这使您可以将所需的任何属性作为 KeyValue 对直接存储到 Products 对象中。现在,显示它们变得更加有趣,因为您不能再使用直接数据绑定了……编辑也是如此。但是直接设置框和标签很容易。

另一种解决方案 -运行时类型

声明一个实际上并不存在但可以像它一样使用的自定义类型。

var ExtProduct = new {
    MyCustomProp = "whatever I want",
    ProductBase = productInstace };

根据需要延长。

您也可以使用列表执行此操作

var ExtProductList = from a in ProductList select new {
    MyCustomProp = "Whatever I want",
    ProductBase = a };

这是一个非常临时的东西,在将值传递给其他东西时几乎没有用,但对于从连接列表或临时值的 UI 显示进行自定义计算具有巨大的实用性。当您需要自定义值可编辑时,它们有点难以捕捉,但不是很明显。

于 2012-06-07T20:48:43.953 回答