If I have a child business object, be it a businesslistbase or businessbase, what is the most efficient way to get the ultimate root object?
I don't normally like the idea of looking up the object graph, but this is an instance where I want to.
Leveraging the parent property seems appealing to me, but since parent is protected, this sort of logic would be difficult when dealing with grandchildren or even children in a child collection, etc. Thought about providing an interface for my business objects that might provide public access for parent, but I'd rather not add it if I don't have to -- reflection seems like it might be a possible route too but I'm not sold on that either.
Hoping I'm missing an obvious solution to getting the root object from a child object somewhere in the root's object graph.
Chris
Chris,
Is it possible you post some code about this interface and its implementation ?
Thanks
Dominique
The interface:
/// <summary>
/// IChild provides for a means to get a Csla object's parent. Parent is a protected property, /// so this interface simply provides for a public means to get it. /// </summary> public interface IChild{
/// <summary> /// Gets the parent object of this object. /// </summary> /// <returns>This object's parent.</returns> object GetParent();}
My business base AND my business list base (inheriting from CSLA objects) implement IChild and provide for GetRootObject.
#region
IChild Implementation /// <summary> /// Gets the parent object of this object. /// </summary> /// <returns>This object's parent.</returns> object IChild.GetParent(){
return this.Parent;}
#endregion
/// <summary> /// Gets the current object's root object. /// </summary> /// <returns>The current object's root object.</returns> public object GetRootObject()
{
object index = this; while (index is IChild && ((IChild)index).GetParent() != null){
index = ((
IChild)index).GetParent();}
return index;}
Many thanks for your code and your very quick answer.
Here your code in VB, I translated it wth SharpDevelop.
If it can help VB people.
''' <summary>
''' IChild provides for a means to get a Csla object's parent. Parent is a protected property,
''' so this interface simply provides for a public means to get it.
''' </summary>
Public Interface IChild
''' <summary>
''' Gets the parent object of this object.
''' </summary>
''' <returns>This object's parent.</returns>
Function GetParent() As Object Implements INotifiedView.Initialize
End Interface
'''My business base AND my business list base (inheriting from CSLA objects) implement IChild and provide for GetRootObject.
#Region "IChild Implementation"
''' <summary>
''' Gets the parent object of this object.
''' </summary>
''' <returns>This object's parent.</returns>
Private Function IChild_GetParent() As Object Implements IChild.GetParent
Return Me.Parent
End Function
#End Region
''' <summary>
''' Gets the current object's root object.
''' </summary>
''' <returns>The current object's root object.</returns>
Public Function GetRootObject() As Object
Dim index As Object = Me
While TypeOf index Is IChild AndAlso DirectCast(index, IChild).GetParent() IsNot Nothing
index = DirectCast(index, IChild).GetParent()
End While
Return index
End Function
Copyright (c) Marimer LLC