C#中DSL /自定义类型的工具包?

时间:2010-12-14 17:34:50

标签: c# domain-driven-design language-design dsl

所以,我有一个C#应用程序,其自定义类型层次结构是~4层深。

此分层存在是为了提供数据验证和更改事件传播的干净实现。

一个例子是: DocumentNameValue -> NameValue - > StringValue -> BaseDataValue

系统工作正常,但考虑到所有间接层,性能冲浪者。从绝对意义上说,它并不是一个巨大的打击,但它确实加起来。

为了澄清,性能问题似乎是由于数据访问时发生的嵌套调用。

例如,调用DocumentNameValue.setValue("test.doc")将导致每层层次结构对输入运行某些验证测试。这些从基地开始向上移动。沿途还发生了各种事件。如果有意义的话,该值实际上是“存储”在层次结构的基础上。

由于我所做的一切都是定义严格的类型层次结构,是否存在推荐的方法来执行以下任一操作:

  1. 将此C#代码转换为“平坦”高性能等效代码? (运行时或编译时)
  2. 或者,或许更好的是,构建一个只会吐出类型/对象的等效列表的DSL?
  3. 总体目标是双重的:拥有特定于我的应用程序问题域的强类型,为我的验证规则提供一个干净的位置。

    任何人都可以提供一些提示/建议吗?我做错了吗?

    谢谢

3 个答案:

答案 0 :(得分:3)

我的第一直觉是质疑你是如何知道这是你的表现受到影响的原因。你有没有运行过探查器?

我的第二个问题是要求代码样本。这个分层是通过OOP(继承)反映出来的吗?

根据我的理解,您使用不同的类型来表示不同的问题 - 这很好。你已经构建了类似ViewModel / Model / DataModel的东西,这是非常标准的。


鉴于您的评论,我建议您下载ANTS Performance Profiler的试用版并使用它来描述缓慢的实施;它会准确地告诉您哪些方法花费的时间最长,并且可以让您量化变化的结果。

除非应用程序非常简单,否则我不会建议拆分您的分层方法。学习如何干净地实施分层系统可以在以后获得理智。

答案 1 :(得分:1)

  

系统工作正常,但总的来说   间接层,性能层   冲浪者。从绝对意义上说,它不是一个   巨大的打击,但它确实加起来。

可能不是。你很可能需要重新审视这个假设。

  

经常这样做吗?

没有。因为没有必要。创建一个继承层次结构(与不继承另一个层次的类相比)并不会对庞大,庞大,庞大,压倒性的绝大多数应用程序中的性能产生重大影响。此外,如果您的项目是 因使用继承而受到有意义影响的项目,那么您可能已经使用托管语言做出了错误的决定。

答案 2 :(得分:0)

  

为了澄清,性能问题似乎是由于数据访问时发生的嵌套调用。

     

例如,调用DocumentNameValue.setValue(“test.doc”)将导致每层层次结构对输入运行某些验证测试。

您已经抽象到最大程度,因此失去了对数据访问的控制权。类型是否被展平不会改变发布的SQL或在数据库中花费的IO。

将数据访问移出抽象,或者在每个setter上遭受意外的IO成本。懒惰。