In particular, is there a reason you cannot use a single tall port whose fromSpot or toSpot is Spot.LeftSide or Spot.RightSide, as appropriate? That way the links are automatically spread out across the length of the port.
Also, does your app want to have a restriction that there is at most one link connected with a port? If so, that makes it difficult for the user to try to draw a new link to a node, if all of the ports were created with a link connected. There are various solutions, but that is why Simon asked for what your design envisions, before/during/after the linking operation.
First, do you want the “ports” to be logically distinct from each other, or only physically apart from each other? In other words, do you want to assign unique GraphObject.portId values for each port as they are created? Or can all of the links connect to a single port but be spread out with a black square at the end of each link?
Second, what should happen when the user deletes a link or disconnects a link? Should the black square remain, and should it be linkable by a newly drawn link?
Third, do you really want to do that with the outputs? I don’t think that having separate ports spread out (or alternatively a single output port with the links spread out) would look good. It depends on the shape of the node, of course. Most systems support some amount of “fan-out”.