Code sample: Implementing Managers (PARole)


C# public

[ACClassInfo("mycompany.erp", "en{'Shared code for Purchase Orders'}de{'Gemeinsamer code für Bestellungen'}", Global.ACKinds.TPARole, Global.ACStorableTypes.NotStorable, false, false)]
public class InOrderManager : PARole
{
    public InOrderManager(ACClass acType, IACObject content, IACObject parentACObject, ACValueList parameter, string acIdentifier = "")
        : base(acType, content, parentACObject, parameter, acIdentifier)
    {
    }
    public const string C_DefaultServiceACIdentifier = "InOrderManager";

    /// (A) If you use InOrderManager as a local service object
    public static InOrderManager GetServiceInstance(ACComponent requester)
    {
        return GetServiceInstance<InOrderManager>(requester, C_DefaultServiceACIdentifier, CreationBehaviour.OnlyLocal|CreationBehaviour.FirstOrDefault);
    }

    /// (C) If you use InOrderManager as a network service object
    public static ACComponent GetServiceInstanceNet(ACComponent requester)
    {
        return GetServiceInstance<ACComponent>(requester, C_DefaultServiceACIdentifier);
    }

    /// (B) If you use InOrderManager as a local service object
    public static ACRef<InOrderManager> ACRefToServiceInstance(ACComponent requester)
    {
        InOrderManager serviceInstance = GetServiceInstance(requester);
        if (serviceInstance != null)
            return new ACRef<InOrderManager>(serviceInstance, requester);
        return null;
    }

    /// (D) If you use InOrderManager as a network service object
    public static ACRef<ACComponent> ACRefToServiceInstanceNet(ACComponent requester)
    {
        ACComponent serviceInstance = GetServiceInstanceNet(requester);
        if (serviceInstance != null)
            return new ACRef<ACComponent>(serviceInstance, requester);
        return null;
    }

    /// <summary>(E) Method for local usage when instance is configured as a local service object at "\LocalServiceObjects"</summary>
    public double SumLines(MyCompanyDB dbApp, InOrder inOrder)
    {
        double sumTargetQuantity = 0.0;
        foreach (InOrderPos line in inOrder.InOrderPos_InOrder)
        {
            Add(dbApp, line, ref sumTargetQuantity);
        }
        return sumTargetQuantity;
    }

    /// <summary>(F) Method for remote usage when instance is configured as a network service object at e.g. "\Services"</summary>
    [ACMethodInfo("Function", "en{'Sum lines'}de{'Summiere Positionen'}", 200)]
    public double SumLinesByID(Guid inOrderID)
    {
        // Implement stateless: Never use MyCompanyDB in a private Field!
        using (MyCompanyDB dbApp = new MyCompanyDB())
        {
            double sumTargetQuantity = 0.0;
            foreach (InOrderPos line in dbApp.InOrderPos.Where(c => c.InOrderID == inOrderID))
            {
                Add(dbApp, line, ref sumTargetQuantity);
            }
            return sumTargetQuantity;
        }
    }

    /// <summary>Implement stateless: Pass all necessary data instead using private fields. e.g. "sumTargetQuantity" is passed by reference</summary>
    private void Add(MyCompanyDB dbApp, InOrderPos line, ref double sumTargetQuantity)
    {
        sumTargetQuantity += line.TargetQuantity;
    }

    protected override bool HandleExecuteACMethod(out object result, AsyncMethodInvocationMode invocationMode, string acMethodName, gip.core.datamodel.ACClassMethod acClassMethod, params object[] acParameter)
    {
        result = null;
        switch (acMethodName)
        {
            case "SumLinesByID":
                result = SumLinesByID((Guid) acParameter[0]);
                return true;
        }
        return base.HandleExecuteACMethod(out result, invocationMode, acMethodName, acClassMethod, acParameter);
    }
}

Modifier: Damir Lisak / Modified:26.12.2020 15:22