/// <summary>
        /// Initialised when user logs in
        /// I probably would have created a container module for this
        /// </summary>
        public static UserSessionState Initialise(User user, IRepository <User, UserPet> userRepository,
                                                  IRepository <Pet, PetMetric> petRepository, IRepository <Animal, AnimalMetric> animalRepository,
                                                  IRepository <Interaction, MetricInteraction> interactionRepository, IConfiguration config,
                                                  UserSessionBuilder userSessionBuilder, IContainer container)
        {
            //Validator
            var petRegistrationValidator =
                new PetRegistrationValidator(animalRepository, petRepository, userRepository);

            var petCareActionValidator =
                new PetCareActionValidator(petRepository, interactionRepository);
            var validator = new UserSessionRequestValidator(user, userRepository, petRepository,
                                                            petRegistrationValidator, petCareActionValidator);

            //Persisters
            var petPersister       = container.RecordPersister <Pet>();
            var userPetPersister   = container.RecordPersister <UserPet>();
            var petMetricPersister = container.RecordPersister <PetMetric>();

            //Processor
            var sessionRequestProcessor = new SessionRequestProcessor(user, userRepository, petRepository,
                                                                      interactionRepository, petPersister, userPetPersister,
                                                                      petMetricPersister, userSessionBuilder);

            return(new UserSessionState(user, userRepository, petRepository, validator, sessionRequestProcessor));
        }
 public SessionRequestProcessor(User user,
                                IRepository <User, UserPet> users, IRepository <Pet, PetMetric> pets, IRepository <Interaction, MetricInteraction> interactionRepository,
                                IRecordPersister <Pet> petPersister, IRecordPersister <UserPet> userPetPersister, IRecordPersister <PetMetric> petMetricPersister,
                                UserSessionBuilder userSessionBuilder)
 {
     _user  = user;
     _users = users;
     _pets  = pets;
     _interactionRepository = interactionRepository;
     _petPersister          = petPersister;
     _userPetPersister      = userPetPersister;
     _petMetricPersister    = petMetricPersister;
     _userSessionBuilder    = userSessionBuilder;
 }