public void CreateMachineAgents(FResourceSetupDefinition resourceSetupDefinition)
        {
            var resourceSetups = resourceSetupDefinition.ResourceSetup as List <M_ResourceSetup>;

            // Create Skill based Hub Agent for each Skill of resource
            // TODO Currently Resource can only have one Skill and discriminator between subskills are made by resourceTool
            foreach (var resourceSetup in resourceSetups)
            {
                var hub = fRequestResources.FirstOrDefault(predicate: x => x.Discriminator == resourceSetup.ResourceSkill.Name && x.ResourceType == FResourceType.Hub);
                if (hub == null)
                {
                    var hubAgent = Agent.Context.ActorOf(props: Hub.Props(actorPaths: Agent.ActorPaths
                                                                          , time: Agent.CurrentTime
                                                                          , simtype: SimulationType
                                                                          , debug: Agent.DebugThis
                                                                          , principal: Agent.Context.Self)
                                                         , name: "Hub(" + resourceSetup.ResourceSkill.Name + ")");
                    //Agent.Send(BasicInstruction.Initialize.Create(Agent.Context.Self, HubBehaviour.Get(machine.MachineGroup.Name)));
                    hub = new FRequestResource(discriminator: resourceSetup.ResourceSkill.Name, resourceType: FResourceType.Hub, actorRef: hubAgent);
                    fRequestResources.Add(item: hub);
                }
            }

            var resource = resourceSetups.FirstOrDefault().Resource as M_Resource;
            // Create resource If Required
            var resourceAgent = Agent.Context.ActorOf(props: Resource.Props(actorPaths: Agent.ActorPaths
                                                                            , resource: resource
                                                                            , time: Agent.CurrentTime
                                                                            , debug: Agent.DebugThis
                                                                            // TODO : Handle 1 resource in multiply hub agents
                                                                            , principal: fRequestResources.FirstOrDefault(predicate: x => x.Discriminator == resource.ResourceSetups.First().ResourceSkill.Name &&
                                                                                                                          x.ResourceType == FResourceType.Hub).actorRef)
                                                      , name: ("Machine(" + resource.Name + ")").ToActorName());


            Agent.Send(instruction: BasicInstruction.Initialize
                       .Create(target: resourceAgent
                               , message: ResourceAgent.Behaviour
                               .Factory.Get(simType: SimulationType
                                            , workTimeGenerator: resourceSetupDefinition.WorkTimeGenerator as WorkTimeGenerator
                                            , resourceId: resource.Id
                                            , toolManager: new ToolManager(resourceSetups: resourceSetups))));
        }
        /// <summary>
        /// Creates ResourcesAgents based on current Model and add them to the SimulationContext
        /// </summary>
        /// <param name="configuration">Environment.Configuration</param>
        private void CreateResourceAgents(Configuration configuration)
        {
            WorkTimeGenerator randomWorkTime = WorkTimeGenerator.Create(configuration: configuration);

            var setups = _dBContext.ResourceSetups.Include(navigationPropertyPath: m => m.Resource)
                         .Include(navigationPropertyPath: r => r.ResourceSkill)
                         .ThenInclude(s => s.ResourceSetups)
                         .Include(navigationPropertyPath: t => t.ResourceTool)
                         .AsNoTracking().ToListAsync().Result;

            var resourceList = _dBContext.Resources.ToList();

            foreach (var resource in resourceList)
            {
                var resourceSetups = setups.Where(predicate: x => x.ResourceId == resource.Id).ToList();

                var resourceSetupDefinition = new FResourceSetupDefinition(workTimeGenerator: randomWorkTime, resourceSetup: resourceSetups, debug: _debugAgents);

                _simulation.SimulationContext.Tell(message: Directory.Instruction
                                                   .CreateMachineAgents
                                                   .Create(message: resourceSetupDefinition, target: ActorPaths.HubDirectory.Ref)
                                                   , sender: ActorPaths.HubDirectory.Ref);
            }
        }
 public static CreateMachineAgents Create(FResourceSetupDefinition message, IActorRef target)
 {
     return(new CreateMachineAgents(message: message, target: target));
 }