gpt4 book ai didi

c# - 设计流畅的构建器以在 C# 中创建对象图

转载 作者:行者123 更新时间:2023-11-30 21:11:26 24 4
gpt4 key购买 nike

我第一次尝试用 C# 编写流畅的构建器,这样我就可以简化创建对象图的逻辑。

我的第一个想法是为每个类创建一个流畅的构建器,然后像这样分层嵌套它们:

School school = SchoolBuilder.New()
.WithName("Whatchamatta U")
.AddClass(
ClassBuilder.New()
.WithName("Arithmetic")
.WithClassNumber("101")
.AddStudent(
StudentBuilder.New()
.WithName("John Smith")
)
.AddStudent(
StudentBuilder.New()
.WithName("Jane Smith")
)
)
.Save()

这很容易作为使用 C# 接口(interface)的状态机来实现,并且相当容易理解,无论是作为开发人员尝试阅读代码还是作为开发人员尝试创建新代码(“With*”=设置属性, “Add*”=添加一个子对象,“Save”会做任何需要做的事情来创建图表),但我认为开发人员阅读和编写如下所示的 DSL 可能更容易:

School school = SchoolBuilder.New()
.WithName("Whatchamatta U")
.AddClass()
.WithClassName("Arithmetic")
.WithClassNumber("101")
.AddStudent()
.WithStudentName("John Smith")
.AddStudent()
.WithStudentName("Jane Smith")
.Save()

由于所有构建器的消息都通过最顶层的父构建器对象,我想我需要找到一些方法将它们沿着层次结构向下路由到适当的子构建器对象。在 Ruby 中,这可以通过 method_missing 完成,但我看不到在 C# 中实现它的巧妙方法。

一个丑陋的解决方案是让每个父对象实现每个潜在后代对象的接口(interface),其中每个方法将其调用路由到子对象。显然这是不可取的,尤其是当我向层次结构中添加更多构建器类时,但我不知道有一种简洁的方法可以在编译时“虚拟”实现这些接口(interface),但拦截对该接口(interface)的所有调用并将它们代理到树下, a la method_missing。我可以看到有一些方法可以在 C# 中使用动态代理在运行时动态实现接口(interface),但我认为这些方法都不支持智能感知。

我的要求是 a) 这适用于 intellisense 和 b) 任何构建器都可以用于构建对象而无需引用其父项——这意味着我希望所有构建器都能够处理其子构建器的构建(这意味着丑陋的解决方案将真的丑陋)

有没有办法在 C# 中采用第二条路线?或者这是错误的思考方式?

最佳答案

另一种可能是使用 object initializer语法代替。所以像这样:

School school = new School {
Name = "Watchamatta U",
Classes = new[] {
new Class {
Name = "Arithmetic",
Number = "101",
Students = new[] {
// etc.
}
}
}
};

这会初始化属性,因此您可以将数组更改为对象。

关于c# - 设计流畅的构建器以在 C# 中创建对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8072492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com