diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..10061b4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,19 @@ +language: csharp +sudo: required +dist: trusty +mono: none +dotnet: 1.0.0 + +install: + - export DOTNET_CLI_TELEMETRY_OPTOUT=1 + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then rvm get stable; brew update; brew install openssl; fi +os: + - linux + - osx +osx_image: xcode7.3 +before_script: + - chmod a+x ./build.sh +script: + - ./build.sh +notifications: + email: false diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b4aebfe --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,23 @@ +# Change Log +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/) +and this project adheres to [Semantic Versioning](http://semver.org/). + +## [Unreleased] +_Nothing yet..._ + +## [0.7.0] - 2017-06-08 +### Changed +- SqlServer: Set migration history's table name and schema. + +### Fixed +- Services not being disposed correctly after a job execution. [#4](https://github.com/mrahhal/MR.AspNetCore.Jobs/issues/4) + +## [0.6.0] - 2017-04-22 +### Changed +- SqlServer: Move to using EFCore to manage internal migrations and connections to the database. + +[Unreleased]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.7.0...HEAD +[0.7.0]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.6.0...0.7.0 +[0.6.0]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.5.0...0.6.0 diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..72b4040 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,22 @@ +version: '{build}' +os: Visual Studio 2015 +environment: + BUILDING_ON_PLATFORM: win + BuildEnvironment: appveyor + Jobs_SqlServer_ConnectionStringTemplate: Server=.\SQL2012SP1;Database={0};User ID=sa;Password=Password12! +services: + - mssql2012sp1 +build_script: +- ps: ./ConfigureMSDTC.ps1 +- ps: ./build.ps1 +test: off +artifacts: +- path: artifacts/packages/*.nupkg +deploy: + provider: NuGet + on: + appveyor_repo_tag: true + api_key: + secure: PWCeOQ12fgAhPiBjgkBAqHbvaPQArarsO2sI+8KCeXjBjE+AHaMIMW8b7efmDzQ6 + skip_symbols: true + artifact: /artifacts\/packages\/.+\.nupkg/ diff --git a/build.cake b/build.cake new file mode 100644 index 0000000..02b52c4 --- /dev/null +++ b/build.cake @@ -0,0 +1,100 @@ +#addin "nuget:https://www.nuget.org/api/v2?package=Newtonsoft.Json&version=9.0.1" + +#load "./build/index.cake" + +var target = Argument("target", "Default"); + +var build = BuildParameters.Create(Context); +var util = new Util(Context, build); + +Task("Clean") + .Does(() => +{ + if (DirectoryExists("./artifacts")) + { + DeleteDirectory("./artifacts", true); + } +}); + +Task("Restore") + .IsDependentOn("Clean") + .Does(() => +{ + var settings = new DotNetCoreRestoreSettings + { + ArgumentCustomization = args => + { + args.Append($"/p:VersionSuffix={build.Version.Suffix}"); + return args; + } + }; + DotNetCoreRestore(settings); +}); + +Task("Build") + .IsDependentOn("Restore") + .Does(() => +{ + var settings = new DotNetCoreBuildSettings + { + Configuration = build.Configuration, + VersionSuffix = build.Version.Suffix, + ArgumentCustomization = args => + { + args.Append($"/p:InformationalVersion={build.Version.VersionWithSuffix()}"); + return args; + } + }; + foreach (var project in build.ProjectFiles) + { + DotNetCoreBuild(project.FullPath, settings); + } +}); + +Task("Test") + .IsDependentOn("Build") + .Does(() => +{ + foreach (var testProject in build.TestProjectFiles) + { + DotNetCoreTest(testProject.FullPath); + } +}); + +Task("Pack") + .Does(() => +{ + var settings = new DotNetCorePackSettings + { + Configuration = build.Configuration, + VersionSuffix = build.Version.Suffix, + OutputDirectory = "./artifacts/packages" + }; + foreach (var project in build.ProjectFiles) + { + DotNetCorePack(project.FullPath, settings); + } +}); + +Task("Default") + .IsDependentOn("Build") + .IsDependentOn("Test") + .IsDependentOn("Pack") + .Does(() => +{ + util.PrintInfo(); +}); + +Task("Version") + .Does(() => +{ + Information($"{build.FullVersion()}"); +}); + +Task("Print") + .Does(() => +{ + util.PrintInfo(); +}); + +RunTarget(target); diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..7526d9f --- /dev/null +++ b/build.ps1 @@ -0,0 +1,183 @@ +<# + +.SYNOPSIS +This is a Powershell script to bootstrap a Cake build. + +.DESCRIPTION +This Powershell script will download NuGet if missing, restore NuGet tools (including Cake) +and execute your Cake build script with the parameters you provide. + +.PARAMETER Script +The build script to execute. +.PARAMETER Target +The build script target to run. +.PARAMETER Configuration +The build configuration to use. +.PARAMETER Verbosity +Specifies the amount of information to be displayed. +.PARAMETER Experimental +Tells Cake to use the latest Roslyn release. +.PARAMETER WhatIf +Performs a dry run of the build script. +No tasks will be executed. +.PARAMETER Mono +Tells Cake to use the Mono scripting engine. +.PARAMETER SkipToolPackageRestore +Skips restoring of packages. +.PARAMETER ScriptArgs +Remaining arguments are added here. + +.LINK +http://cakebuild.net + +#> + +[CmdletBinding()] +Param( + [string]$Script = "build.cake", + [string]$Target = "Default", + [ValidateSet("Release", "Debug")] + [string]$Configuration = "Debug", + [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")] + [string]$Verbosity = "Normal", + [switch]$Experimental = $true, + [Alias("DryRun","Noop")] + [switch]$WhatIf, + [switch]$Mono, + [switch]$SkipToolPackageRestore, + [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] + [string[]]$ScriptArgs +) + +[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null +function MD5HashFile([string] $filePath) +{ + if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf)) + { + return $null + } + + [System.IO.Stream] $file = $null; + [System.Security.Cryptography.MD5] $md5 = $null; + try + { + $md5 = [System.Security.Cryptography.MD5]::Create() + $file = [System.IO.File]::OpenRead($filePath) + return [System.BitConverter]::ToString($md5.ComputeHash($file)) + } + finally + { + if ($file -ne $null) + { + $file.Dispose() + } + } +} + +Write-Host "Preparing to run build script..." + +if(!$PSScriptRoot){ + $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent +} + +$TOOLS_DIR = Join-Path $PSScriptRoot "tools" +$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe" +$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe" +$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" +$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config" +$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum" + +# Should we use mono? +$UseMono = ""; +if($Mono.IsPresent) { + Write-Verbose -Message "Using the Mono based scripting engine." + $UseMono = "-mono" +} + +# Should we use the new Roslyn? +$UseExperimental = ""; +if($Experimental.IsPresent -and !($Mono.IsPresent)) { + Write-Verbose -Message "Using experimental version of Roslyn." + $UseExperimental = "-experimental" +} + +# Is this a dry run? +$UseDryRun = ""; +if($WhatIf.IsPresent) { + $UseDryRun = "-dryrun" +} + +# Make sure tools folder exists +if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) { + Write-Verbose -Message "Creating tools directory..." + New-Item -Path $TOOLS_DIR -Type directory | out-null +} + +# Make sure that packages.config exist. +if (!(Test-Path $PACKAGES_CONFIG)) { + Write-Verbose -Message "Downloading packages.config..." + try { (New-Object System.Net.WebClient).DownloadFile("http://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch { + Throw "Could not download packages.config." + } +} + +# Try find NuGet.exe in path if not exists +if (!(Test-Path $NUGET_EXE)) { + Write-Verbose -Message "Trying to find nuget.exe in PATH..." + $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_) } + $NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1 + if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) { + Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)." + $NUGET_EXE = $NUGET_EXE_IN_PATH.FullName + } +} + +# Try download NuGet.exe if not exists +if (!(Test-Path $NUGET_EXE)) { + Write-Verbose -Message "Downloading NuGet.exe..." + try { + (New-Object System.Net.WebClient).DownloadFile($NUGET_URL, $NUGET_EXE) + } catch { + Throw "Could not download NuGet.exe." + } +} + +# Save nuget.exe path to environment to be available to child processed +$ENV:NUGET_EXE = $NUGET_EXE + +# Restore tools from NuGet? +if(-Not $SkipToolPackageRestore.IsPresent) { + Push-Location + Set-Location $TOOLS_DIR + + # Check for changes in packages.config and remove installed tools if true. + [string] $md5Hash = MD5HashFile($PACKAGES_CONFIG) + if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or + ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) { + Write-Verbose -Message "Missing or changed package.config hash..." + Remove-Item * -Recurse -Exclude packages.config,nuget.exe + } + + Write-Verbose -Message "Restoring tools from NuGet..." + $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`"" + + if ($LASTEXITCODE -ne 0) { + Throw "An error occured while restoring NuGet tools." + } + else + { + $md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII" + } + Write-Verbose -Message ($NuGetOutput | out-string) + Pop-Location +} + +# Make sure that Cake has been installed. +if (!(Test-Path $CAKE_EXE)) { + Throw "Could not find Cake.exe at $CAKE_EXE" +} + +# Start Cake +Write-Host "Running build script..." +Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs" +exit $LASTEXITCODE diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..15f08bf --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +dotnet --info +dotnet restore +dotnet test test/Cap.Consistency.EntityFrameworkCore.Test/Cap.Consistency.EntityFrameworkCore.Test.csproj -f netcoreapp1.1 +dotnet test test/Cap.Consistency.Test/Cap.Consistency.Test.csproj -f netcoreapp1.1 \ No newline at end of file diff --git a/build/common.props b/build/common.props new file mode 100644 index 0000000..9d6bc4b --- /dev/null +++ b/build/common.props @@ -0,0 +1,16 @@ + + + + + + netstandard1.6 + + + + Cap + Savorboard + https://github.com/ouraspnet/cap + https://github.com/ouraspnet/cap/blob/master/LICENSE + + + diff --git a/build/index.cake b/build/index.cake new file mode 100644 index 0000000..f0684bf --- /dev/null +++ b/build/index.cake @@ -0,0 +1,2 @@ +#load "./util.cake" +#load "./version.cake" diff --git a/build/util.cake b/build/util.cake new file mode 100644 index 0000000..4a18e87 --- /dev/null +++ b/build/util.cake @@ -0,0 +1,25 @@ +public class Util +{ + public Util(ICakeContext context, BuildParameters build) + { + Context = context; + Build = build; + } + + public ICakeContext Context { get; set; } + public BuildParameters Build { get; set; } + + public void PrintInfo() + { + Context.Information($@" +Version: {Build.FullVersion()} +Configuration: {Build.Configuration} +"); + } + + public static string CreateStamp() + { + var seconds = (long)(DateTime.UtcNow - new DateTime(2017, 1, 1)).TotalSeconds; + return seconds.ToString().PadLeft(11, (char)'0'); + } +} diff --git a/build/version.cake b/build/version.cake new file mode 100644 index 0000000..f0db1ac --- /dev/null +++ b/build/version.cake @@ -0,0 +1,120 @@ +using System.Xml; + +public class BuildParameters +{ + public BuildParameters(ICakeContext context) + { + Context = context; + } + + public ICakeContext Context { get; } + public BuildVersion Version { get; private set; } + public string Configuration { get; private set; } + public bool IsTagged { get; private set; } + public bool IsCI { get; private set; } + public DirectoryPathCollection Projects { get; set; } + public DirectoryPathCollection TestProjects { get; set; } + public FilePathCollection ProjectFiles { get; set; } + public FilePathCollection TestProjectFiles { get; set; } + + public static BuildParameters Create(ICakeContext context) + { + var buildParameters = new BuildParameters(context); + buildParameters.Initialize(); + return buildParameters; + } + + public string FullVersion() + { + return Version.VersionWithSuffix(); + } + + private void Initialize() + { + InitializeCore(); + InitializeVersion(); + } + + private void InitializeCore() + { + Projects = Context.GetDirectories("./src/*"); + TestProjects = Context.GetDirectories("./test/*"); + ProjectFiles = Context.GetFiles("./src/*/*.csproj"); + TestProjectFiles = Context.GetFiles("./test/*/*.csproj"); + + var buildSystem = Context.BuildSystem(); + if (!buildSystem.IsLocalBuild) + { + IsCI = true; + if ((buildSystem.IsRunningOnAppVeyor && buildSystem.AppVeyor.Environment.Repository.Tag.IsTag) || + (buildSystem.IsRunningOnTravisCI && string.IsNullOrWhiteSpace(buildSystem.TravisCI.Environment.Build.Tag))) + { + IsTagged = true; + } + } + + Configuration = Context.Argument("Configuration", "Debug"); + if (IsCI) + { + Configuration = "Release"; + } + } + + private void InitializeVersion() + { + var versionFile = Context.File("./build/version.props"); + var content = System.IO.File.ReadAllText(versionFile.Path.FullPath); + + XmlDocument doc = new XmlDocument(); + doc.LoadXml(content); + + var versionMajor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMajor").InnerText; + var versionMinor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMinor").InnerText; + var versionPatch = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionPatch").InnerText; + var versionQuality = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionQuality").InnerText; + versionQuality = string.IsNullOrWhiteSpace(versionQuality) ? null : versionQuality; + + var suffix = versionQuality; + if (!IsTagged) + { + suffix += (IsCI ? "ci-" : "dv-") + Util.CreateStamp(); + } + suffix = string.IsNullOrWhiteSpace(suffix) ? null : suffix; + + Version = + new BuildVersion(int.Parse(versionMajor), int.Parse(versionMinor), int.Parse(versionPatch), versionQuality); + Version.Suffix = suffix; + } +} + +public class BuildVersion +{ + public BuildVersion(int major, int minor, int patch, string quality) + { + Major = major; + Minor = minor; + Patch = patch; + Quality = quality; + } + + public int Major { get; set; } + public int Minor { get; set; } + public int Patch { get; set; } + public string Quality { get; set; } + public string Suffix { get; set; } + + public string VersionWithoutQuality() + { + return $"{Major}.{Minor}.{Patch}"; + } + + public string Version() + { + return VersionWithoutQuality() + (Quality == null ? string.Empty : $"-{Quality}"); + } + + public string VersionWithSuffix() + { + return Version() + (Suffix == null ? string.Empty : $"-{Suffix}"); + } +} diff --git a/build/version.props b/build/version.props new file mode 100644 index 0000000..15a038f --- /dev/null +++ b/build/version.props @@ -0,0 +1,9 @@ + + + 0 + 7 + 2 + + $(VersionMajor).$(VersionMinor).$(VersionPatch) + + diff --git a/samples/Sample.Kafka/AppDbContext.cs b/samples/Sample.Kafka/AppDbContext.cs index e929396..4b19e10 100644 --- a/samples/Sample.Kafka/AppDbContext.cs +++ b/samples/Sample.Kafka/AppDbContext.cs @@ -10,6 +10,16 @@ namespace Sample.Kafka { public class AppDbContext : DbContext { + + public AppDbContext(DbContextOptions options) : base(options) { + } + public DbSet Messages { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { + //optionsBuilder.UseSqlServer + base.OnConfiguring(optionsBuilder); + } + } } diff --git a/samples/Sample.Kafka/Controllers/ValuesController.cs b/samples/Sample.Kafka/Controllers/ValuesController.cs index 8fc02af..c9d1032 100644 --- a/samples/Sample.Kafka/Controllers/ValuesController.cs +++ b/samples/Sample.Kafka/Controllers/ValuesController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Cap.Consistency.Consumer; +using Cap.Consistency.Infrastructure; using Cap.Consistency.Kafka; using Cap.Consistency.Producer; using Microsoft.AspNetCore.Mvc; @@ -13,13 +14,25 @@ namespace Sample.Kafka.Controllers public class ValuesController : Controller, IConsumerService { private readonly IProducerClient _producer; + private readonly AppDbContext _dbContext; - public ValuesController(IProducerClient producer) { + public ValuesController(IProducerClient producer, AppDbContext dbContext) { _producer = producer; + _dbContext = dbContext; } [Route("/")] public IActionResult Index() { + + _dbContext.Add(new ConsistencyMessage { + Id = Guid.NewGuid().ToString(), + SendTime = DateTime.Now, + Payload = "testdata", + UpdateTime = DateTime.Now + }); + + _dbContext.SaveChanges(); + return Ok(); } diff --git a/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.Designer.cs b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.Designer.cs new file mode 100644 index 0000000..d669814 --- /dev/null +++ b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.Designer.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Sample.Kafka; +using Cap.Consistency.Infrastructure; + +namespace Sample.Kafka.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20170616102520_InitMessages")] + partial class InitMessages + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.2") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Cap.Consistency.Infrastructure.ConsistencyMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Payload"); + + b.Property("SendTime"); + + b.Property("Status"); + + b.Property("UpdateTime"); + + b.HasKey("Id"); + + b.ToTable("Messages"); + }); + } + } +} diff --git a/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.cs b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.cs new file mode 100644 index 0000000..96be53f --- /dev/null +++ b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sample.Kafka.Migrations +{ + public partial class InitMessages : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + Id = table.Column(nullable: false), + Payload = table.Column(nullable: true), + SendTime = table.Column(nullable: false), + Status = table.Column(nullable: false), + UpdateTime = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Messages"); + } + } +} diff --git a/samples/Sample.Kafka/Migrations/AppDbContextModelSnapshot.cs b/samples/Sample.Kafka/Migrations/AppDbContextModelSnapshot.cs new file mode 100644 index 0000000..7c0e777 --- /dev/null +++ b/samples/Sample.Kafka/Migrations/AppDbContextModelSnapshot.cs @@ -0,0 +1,39 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Sample.Kafka; +using Cap.Consistency.Infrastructure; + +namespace Sample.Kafka.Migrations +{ + [DbContext(typeof(AppDbContext))] + partial class AppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.2") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Cap.Consistency.Infrastructure.ConsistencyMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Payload"); + + b.Property("SendTime"); + + b.Property("Status"); + + b.Property("UpdateTime"); + + b.HasKey("Id"); + + b.ToTable("Messages"); + }); + } + } +} diff --git a/samples/Sample.Kafka/Sample.Kafka.csproj b/samples/Sample.Kafka/Sample.Kafka.csproj index f663107..d06b1b2 100644 --- a/samples/Sample.Kafka/Sample.Kafka.csproj +++ b/samples/Sample.Kafka/Sample.Kafka.csproj @@ -12,11 +12,14 @@ + + + diff --git a/samples/Sample.Kafka/Startup.cs b/samples/Sample.Kafka/Startup.cs index 8d44e9c..05cdc6d 100644 --- a/samples/Sample.Kafka/Startup.cs +++ b/samples/Sample.Kafka/Startup.cs @@ -28,7 +28,9 @@ namespace Sample.Kafka // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - services.AddDbContext(); + services.AddDbContext(x => { + x.UseSqlServer(Configuration["ConnectionString"]); + }); services.AddConsistency() .AddEntityFrameworkStores() diff --git a/samples/Sample.Kafka/appsettings.json b/samples/Sample.Kafka/appsettings.json index 5fff67b..7248623 100644 --- a/samples/Sample.Kafka/appsettings.json +++ b/samples/Sample.Kafka/appsettings.json @@ -1,4 +1,5 @@ { + "ConnectionString": "Server=192.168.2.206;Initial Catalog=AspNetCoreSpa;User Id=cmswuliu;Password=h7xY81agBn*Veiu3;MultipleActiveResultSets=True", "Logging": { "IncludeScopes": false, "LogLevel": {