0

我有以下存储在文本文件中的模板:

您好,感谢您购买 {year} {make} {model}。

year, make, and modelcome 存储在 atemplate configuration table中,实际值存储在 a 中Car table

目前,我获取要在模板中使用的所有字段,(year, make, and model)然后从Car表中获取它们的值,并用数据库中的值替换令牌({year}, {make}, {model}),所以它最终看起来像这样:

您好,感谢您购买 2013 年本田思域。

当一切都来自Car表时,这一切都很好,因为如果模板添加需要一个新字段,例如{color},我只需将它添加到template configuration table并且一切正常,并且template configuration table每个用户都是,所以如果一个用户不想要{color},那可以很容易地完成. 我遇到的问题是数据不是来自Car,但可能来自其他表,例如:

您好,感谢您购买 {year} {make} {model}。

您的订单号是 {order_no},您可以联系

如果您有任何问题,请联系 {customer_service_number} 的客户服务。

为了这个例子,让我们假设{order_no}来自一个orders表并且{customer_service_number}来自一个CustomerService表。

我正在考虑采用这样的方法:

var text = @"Hello, Thanks for Buying the {year} {make} {model}.
Your order number is {order_no} and you can contact customer service at {customer_service_number} if you have any problems.";

//This is for fields that are found directly on the Car object
foreach(var field in templateFields)
{
    var val = car.GetType().GetProperty(field).GetValue(car,null);

    text = text.Replace(field, val);
}

//Replace other fields
var order_no = order.GetOrderNo();

text = text.Replace("{order_no}",order_no);

var customer_service_number = customerService.GetCustomerServiceNumber();

text = text.Replace("{customer_service_number}",customer_service_number);

如果每个人都想看到额外的字段,上面的工作很好,但如果只有几个用户想看到order_no and/or the customer_service_number部分,那么调用其中一个或两个是没有意义的。

此外,如果客户想要查看附加信息,那么我必须打另一个电话,例如:

text = text.Replace("{number_of_oil_changes}",car.NumberOfOilChanges);

然后我最终得到了一堆有用和/或无用的方法,具体取决于客户,那么我怎样才能避免编写所有这些额外的方法来获取依赖于客户的信息?

4

1 回答 1

2

我认为这可能是您实际上应该采用不太通用的方法的情况,因为用户界面通常不是通用的。例如,您稍后可能会意识到,想要查看没有年份的模型的客户应该以与查看年份的客户不同的格式查看模型。这些是不同的屏幕,因此可能会有不同的规则,并且每个屏幕都有特定的代码将使以后的工作更容易。

我将创建一个专门针对模板需求量身定制的平面结构。这甚至包括直接来自 的字段Car,因为这意味着如果您的表结构发生更改,您将不需要更新模板。假设您将“模型”分成两列以便于过滤或其他内容 - 在这种情况下,您只需要更新您的结构,以便将“模型”字段设置为,model1 + model2而不是将所有模板更改为{model1}{model2}.

为避免加载冗余信息,您始终可以只检查模板包含哪些字段。在我看来,更好的方法是为您的模板结构使用具有“惰性”属性的类(其值仅在第一次请求时才加载的属性):

class OrderDisplay {
    private readonly Order _order;

    public OrderDisplay(Order order) {
        _order = order;
    }

    private string _orderNo;
    public string OrderNo {
        get {
            if (_orderNo == null) _orderNo = _order.GetOrderNo();
            return _orderNo;
        }
    }

    ...other properties...
}

使用这样的类,您可以{...}通过查找类上的匹配属性来动态替换模板中的每一个。并且每当模板不包含某些属性时,它们自然不会被调用。

于 2013-10-19T22:13:26.153 回答