# BusinessObject

## BusinessObject Introduction

When you first create a BusinessObject it will naturally be the ‘master’, aka the one that creates the transaction. But in time it should be able to be consumed by another parent business object. In order to support this, we have to ensure that we have a transaction in our business object at the moment of creation, either by getting it from a parent object, or one gets created if none was provided. The moment where the object knows whether it got a transaction from the parent context is the Init method (explained below).

## BusinessObject Lifecycle

* Constructor call
*

    Context passing (this is where the transaction gets passed from the parent businessobject if it gets created through CreateChildBusinessObject)
*

    Init function call

## BusinessObject Initialization

{% hint style="danger" %}
Never create BusinessObjects using new!!!
{% endhint %}

* do NOT create child businessobjects in the constructor of the BusinessObject, as it does not (yet) have the transaction information available
*

    use BusinessObjectFactory.CreateBusinessObject\<T>(Transaction transaction) if you have a Transaction instance but you are not in the context of a BusinessObject (e.g. if you create a BusinessObject in a response window which got the Transaction from the main module). It's the main method. The transaction must be explicitly passed (can be null).
*

    use myBusObj.CreateChildBusinessObject\<T>(bool addToChildCollection), if you are within a Business Object and want to create a sub-BusinessObject

    *

        we call CreateChildBusinessObject(addToChildCollection: **true**) in busObj.Init(), when the child BusObj must remain permanently a child of the initial busObj&#x20;
    *

        we call CreateChildBusinessObject(addToChildCollection: **false**) when the child BusObj has a local lifecycle

{% hint style="info" %}
- The default value is **addToChildCollection = true.**
- when setting the Transaction property, the main DataSet (the ‘dSet’ property) receives the transaction as well. No need to pass it explicitly
{% endhint %}

Init function implementation example:

```csharp
public override void Init()
{
    base.Init();

    //this is how we check if we already have a transaction 
    //(passed from another business object) 
    Transaction.VerifyNotNullTransaction(this);

    // here we create the child business objects
    if (boBab == null)
    {
        boBab = this.CreateChildBusinessObject<busBabKoppelprodukt>();
    }

    if (boKalk == null)
    {
        boKalk = this.CreateChildBusinessObject<busKalk>();
    }
}
```
