插入抽象Blazor组件,开闭原理

问题描述

我不知道如何在此处表达好标题

我基本上是在尝试使用开闭原理,因此不需要精确指定要呈现的组件,而只需使用interface / abstract类即可。

我正在制作一个节点编辑器。 我有一个NodeModelBases列表,以保存每个节点的数据,对于每个节点,我想插入一个要渲染的相应NodeComponent。当前:

<div class="diagram-html-layer">
            @foreach (NodeModelBase node in nodeModelManager.Nodes) {
                <NodeBase NodeModel="@node" OnDeleteEvent="OnDeleteNode"/>
            }
</div>

这个想法是NodeModelBase是由特定类型的Node继承的,所以我可以有一个“ StartNode:NodeModelBase”,“ DelayNode:NodeModelBase”等,即NodeModelBase的子类。我可能有20个或更多子类,并且我不想为每个新添加的节点类型更新上述for循环。

然后我想渲染它们各自的组件。当前,我有一个名为NodeBase的Blazor组件,我刚刚插入了它,因为到目前为止我只有一种节点类型。但我希望能够做类似的事情: node.GetHTML() 然后插入它。

我可能需要很长的if-else来检查我拥有NodeModelBase的哪个子类,然后插入正确的组件,例如:

if(node is StartNode) {
    <StartNode/>
} else if (node is DelayNode) {
    <DelayNode/>
} else ...

但这很不方便。

我知道可以使用RenderTreeBuilder以编程方式完成此操作,并进行诸如builder.OpenElement(...)或builder.AddAttribute(...)之类的调用,因此结果将类似于:

<div class="diagram-html-layer">
            @foreach (NodeModelBase node in nodeModelManager.Nodes) {
                @node.GetRenderFragment();
            }
</div>

但是作为html / blazor的新手,我更希望能够正常定义html / razor语法,并以某种方式返回/插入它。

那么,关于如何灵活插入哪个组件的任何建议?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)