public async Task Create(UserDto user)
        {
            var createUserCommand = new CreateEmployerCommand(
                user.FirstName,
                user.LastName,
                user.Email
                );

            await _bus.SendCommand(createUserCommand);
        }
        public static async Task Run(
            [QueueTrigger("employers", Connection = "AzureWebJobsStorage")] string employersJson,
            ILogger log,
            ExecutionContext context)
        {
            var logPrefix = GetLogPrefix();

            log.LogInformation($"{logPrefix}: {employersJson}");

            var employerFromFile = JsonConvert.DeserializeObject <FileUploadEmployer>(employersJson);

            var config = new ConfigurationBuilder()
                         .SetBasePath(context.FunctionAppDirectory)
                         .AddJsonFile("local.settings.json", true, true)
                         .AddEnvironmentVariables()
                         .Build();
            var sqlConnectionString = config.GetConnectionString("Sql");
            var fileUploadContext   = new FileUploadContext(sqlConnectionString);

            var getEmployerQuery = new GetEmployerQuery(fileUploadContext);
            var employerInSql    = await getEmployerQuery.Execute(employerFromFile.Account);

            var employer = EmployerMapper.Map(employerFromFile, employerInSql);

            if (employerInSql == null)
            {
                log.LogInformation($"{logPrefix} Creating Employer: {employerFromFile.Account}");
                var createEmployerCommand = new CreateEmployerCommand(fileUploadContext);
                await createEmployerCommand.Execute(employer);

                log.LogInformation($"{logPrefix} Created Employer: {employerFromFile.Account}");
            }
            else
            {
                var areEqual = employerInSql.Equals(employer);
                if (!areEqual)
                {
                    log.LogInformation($"{logPrefix} Updating Employer: {employerFromFile.Account}");

                    var updateEmployerCommand = new UpdateEmployerCommand(fileUploadContext);
                    await updateEmployerCommand.Execute(employer);

                    log.LogInformation($"{logPrefix} Updated Employer: {employerFromFile.Account}");
                }
            }

            log.LogInformation($"{logPrefix} Processed Employer: {employerFromFile.Account}");
        }
示例#3
0
        public async Task Run()
        {
            var tokenSource = new CancellationTokenSource();

            // Create 2 people at 1 address
            var addAddressCommand1 = new CreateAddressCommand
            {
                Street     = "15 My Street",
                Suburb     = "Springfield",
                State      = "My State",
                Country    = "Safe Country",
                PostalCode = "12345"
            };
            await _processCommands.Execute(addAddressCommand1, tokenSource.Token).ConfigureAwait(false);

            var addCustomerCommand1 = new CreateCustomerCommand
            {
                FirstName    = "Bob",
                LastName     = "Jones",
                EmailAddress = "*****@*****.**",
                AddressId    = addAddressCommand1.CreatedEntity.Id
                               //Commit = false
            };

            var addCustomerCommand2 = new CreateCustomerCommand
            {
                FirstName    = "Herbert",
                LastName     = "Scrackle",
                EmailAddress = "*****@*****.**",
                AddressId    = addAddressCommand1.CreatedEntity.Id
                               //Commit =  false
            };

            await _processCommands.Execute(addCustomerCommand1, tokenSource.Token).ConfigureAwait(false);

            await _processCommands.Execute(addCustomerCommand2, tokenSource.Token).ConfigureAwait(false);

            // Now create 1 person at a second address
            var addAddressCommand2 = new CreateAddressCommand
            {
                Street     = "742 Evergreen Terrace",
                Suburb     = "Springfield",
                State      = "Unknown",
                Country    = "USA",
                PostalCode = "Unknown"
            };
            await _processCommands.Execute(addAddressCommand2, tokenSource.Token).ConfigureAwait(false);

            var addCustomerCommand3 = new CreateCustomerCommand
            {
                FirstName    = "Homer",
                LastName     = "Simpson",
                EmailAddress = "*****@*****.**",
                AddressId    = addAddressCommand2.CreatedEntity.Id
                               //Commit = false
            };
            await _processCommands.Execute(addCustomerCommand3, tokenSource.Token).ConfigureAwait(false);

            Console.WriteLine("Records created: 2 addresses, 3 people");

            // Now test getting data back
            {
                // Query using "Projector" pattern where the mapping is done on Sql Server rather than in this application.
                // This approach is more efficient as only the required data ever comes back to the application
                var customersByQuery = new CustomersBy
                {
                    FirstName = "Bob"
                };

                var results = await _processQueries.Execute(customersByQuery, tokenSource.Token).ConfigureAwait(false);

                var resultsList = results?.ToList();
                Console.WriteLine($"Querying for Customer with First Name of '{customersByQuery.FirstName}' returns {resultsList?.Count ?? 0}");
                if (resultsList != null && resultsList.Count > 0)
                {
                    var json = JsonSerializer.Serialize(resultsList, new JsonSerializerOptions
                    {
                        WriteIndented = true
                    });

                    Console.WriteLine("Query result:");
                    Console.WriteLine(json);
                }

                Console.WriteLine();
            }

            {
                // Query using Include expressions. There may be scenarios where an include is required. EF Core poses restrictions
                // when using AsExpandable() from LinqKit, so this QueryHandler shows how to pass Include expressions to Query<TEntity>(...)
                var customersWithIncludeByQuery = new CustomersWithIncludeBy()
                {
                    FirstName = "Bob"
                };

                var resultsUsingInclude = await _processQueries.Execute(customersWithIncludeByQuery, tokenSource.Token).ConfigureAwait(false);

                var resultsList = resultsUsingInclude?.ToList();

                Console.WriteLine($"Querying for Customer with First Name of '{customersWithIncludeByQuery.FirstName}' returns {resultsList?.Count ?? 0}");

                if (resultsList != null && resultsList.Count > 0)
                {
                    var json = JsonSerializer.Serialize(resultsList, new JsonSerializerOptions
                    {
                        WriteIndented = true
                    });

                    Console.WriteLine("Query result:");
                    Console.WriteLine(json);
                }

                Console.WriteLine();
            }

            {
                // Get a single address
                var addressesByQuery = new AddressesBy
                {
                    Id = addAddressCommand1.CreatedEntity.Id
                };

                var addressResults = await _processQueries.Execute(addressesByQuery, tokenSource.Token).ConfigureAwait(false);

                var addressResultsList = addressResults?.ToList();
                Console.WriteLine($"Querying for Address with id {addAddressCommand1.CreatedEntity.Id} returns {addressResultsList?.Count ?? 0}");

                if (addressResultsList != null && addressResultsList.Count > 0)
                {
                    var json = JsonSerializer.Serialize(addressResultsList, new JsonSerializerOptions
                    {
                        WriteIndented = true
                    });

                    Console.WriteLine("Query result (1 address):");
                    Console.WriteLine(json);
                }

                Console.WriteLine();
            }

            {
                // Get all address
                var addressesByQuery = new AddressesBy
                {
                };

                var addressResults = await _processQueries.Execute(addressesByQuery, tokenSource.Token).ConfigureAwait(false);

                var addressResultsList = addressResults?.ToList();
                Console.WriteLine($"Querying for all Addresses returns {addressResultsList?.Count ?? 0}");

                if (addressResultsList != null && addressResultsList.Count > 0)
                {
                    var json = JsonSerializer.Serialize(addressResultsList, new JsonSerializerOptions
                    {
                        WriteIndented = true
                    });

                    Console.WriteLine("Query result (multiple addresses):");
                    Console.WriteLine(json);
                }

                Console.WriteLine();
            }

            // Create an Employer, and a CustomerEmployerMapping for one of the Customers above
            var addEmployerCommand = new CreateEmployerCommand
            {
                Name = "Springfield Power Plant"
            };
            await _processCommands.Execute(addEmployerCommand, tokenSource.Token);

            var addCustomerEmployerMappingComand = new CreateCustomerEmployerMappingCommand
            {
                CustomerId = addCustomerCommand3.CreatedEntity.Id,
                EmployerId = addEmployerCommand.CreatedEntity.Id
            };
            await _processCommands.Execute(addCustomerEmployerMappingComand, tokenSource.Token);

            {
                // And now show the full details of all CustomerEmployerMappings, includinging drilling down
                var getAllCEMs = new GetCustomerEmployerMappings();
                var cemResults = await _processQueries.Execute(getAllCEMs, tokenSource.Token).ConfigureAwait(false);

                var cemResultsList = cemResults?.ToList();
                Console.WriteLine($"Querying for all CustomerEmployerMappings returns {cemResultsList?.Count ?? 0}");

                if (cemResultsList != null && cemResultsList.Count > 0)
                {
                    var json = JsonSerializer.Serialize(cemResultsList, new JsonSerializerOptions
                    {
                        WriteIndented = true
                    });

                    Console.WriteLine("Query result:");
                    Console.WriteLine(json);
                }

                Console.WriteLine();
            }
        }