Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding C# actors sdk #29

Merged
merged 54 commits into from
Aug 28, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
61b01f8
Adding http client call
amanbha Jul 17, 2019
ce13f02
Moving ActionsINteractor out of runtime so that ActorProxy can also u…
amanbha Jul 18, 2019
ce12fe2
Adding Functionality for Actor Proxy Code Generation Builder classes,…
shalabhms Aug 16, 2019
28cf592
aspnetcore integration
amanbha Aug 16, 2019
08d5f24
Adding aspnetcore integration and simple invocation, merging with cod…
amanbha Aug 16, 2019
dcea4bf
Adding plumbing for dispatch for StronglyTyped invocation on server s…
amanbha Aug 17, 2019
d709d06
Renaming Dispatch and Invoke method.
amanbha Aug 17, 2019
e45e417
Fixing Constants usage in url.
amanbha Aug 17, 2019
40aceaa
Adding actor state management with json serialization
amanbha Aug 20, 2019
7f6f0c6
Added the server Side Actor Method Dispatcher functionality with more…
shalabhms Aug 20, 2019
15db3e2
Improvement : Removing another layering of classes that implements IM…
shalabhms Aug 20, 2019
22c7d1b
setting InterfaceTypes correctly in ActorTypeInfo
amanbha Aug 20, 2019
74702af
Merge branch 'sdk_v1' of https://github.com/actionscore/cs-sdk into s…
amanbha Aug 20, 2019
bb36e61
Fixing the Deserialization bug - deserializing to WrappedMessageBody …
shalabhms Aug 21, 2019
1f9289a
Changes to build the response message and adding the response header …
shalabhms Aug 22, 2019
2efe78f
Changes to return the HttpResponse from ActorResponseMessage
shalabhms Aug 22, 2019
f5674d2
fixes.
amanbha Aug 23, 2019
5c4d50f
Merge branch 'master' into sdk_v1
amanbha Aug 23, 2019
afa15b0
Adding support for Transactional state management.
amanbha Aug 24, 2019
c421cec
Getting state as byte[]
amanbha Aug 24, 2019
6a7c009
Adding Reminder capabilities to Actors.
amanbha Aug 24, 2019
3792c62
Updating signing key and always strong name signing
amanbha Aug 24, 2019
985db99
Adding timer support
amanbha Aug 25, 2019
6f349cb
Making ActorProxyFactory internal and returning null from ACtorRefere…
amanbha Aug 26, 2019
a268182
Making ActorId string only as Actions only support strigns as Id.
amanbha Aug 26, 2019
cbd80bc
Keeping serialization providers for message body internal for first r…
amanbha Aug 26, 2019
83d2d35
Adds ActorType to ActorReference and ActorProxy so that proxy can be …
amanbha Aug 26, 2019
db4a640
Moving AspNetCore to separate project and nuget pkg.
amanbha Aug 26, 2019
d7d9084
Merge branch 'master' into sdk_v1
amanbha Aug 26, 2019
b20b874
Adding AspNetCore nuget pkg generation to pipelines.
amanbha Aug 26, 2019
e4827e3
Removing codesign step as binaries are strong name signed during the …
amanbha Aug 26, 2019
05ba268
Fixing ACtorReference deserialization.
amanbha Aug 26, 2019
f7d42f3
Fixing the CodeGen issue for GetReturnValue and splitting the request…
shalabhms Aug 26, 2019
e32a37b
Merge branch 'shalabhs/setHttpResponse' into sdk_v1
shalabhms Aug 26, 2019
0c834c1
Updating aspnetcore nuspec.
amanbha Aug 26, 2019
2b7a48a
Making params read only.
amanbha Aug 26, 2019
279c09e
Using pattern matching.
amanbha Aug 26, 2019
c121f35
Updating preview tags.
amanbha Aug 27, 2019
fc383d6
Attemptt o split nugets further.
amanbha Aug 27, 2019
0977c8e
Revert "Attemptt o split nugets further."
amanbha Aug 27, 2019
cb3023d
Making fields read only.
amanbha Aug 27, 2019
474d2ed
Changing XMLDictionaryWriter/Reader to XMLWriter/Reader and handling …
shalabhms Aug 27, 2019
beef8d1
Merge branch 'sdk_v1' of https://github.com/actionscore/cs-sdk into s…
shalabhms Aug 27, 2019
2ba7c2f
Changes to have only one Actions Interactor per ActorProxyFactory
shalabhms Aug 27, 2019
c3afbf7
Fixing ACtorId and ActorType in aCtor proxy when used without remoting.
amanbha Aug 27, 2019
cd710e2
Simplifying ActorProxy creation and initialize.
amanbha Aug 27, 2019
52c93ed
Making IActionsInteractor per ProxyFactory and share it in all proxies.
amanbha Aug 27, 2019
8ecc6fc
Adding Action error codes.
amanbha Aug 27, 2019
1641e4b
Fixing typo
amanbha Aug 27, 2019
a153b29
Replacing Console.WriteLine with ActorTrace,WriteError in ActionsHttp…
amanbha Aug 27, 2019
1cfee76
Using XmlDictionaryReader & XmlDictionaryWriter for DataContract seri…
amanbha Aug 27, 2019
c971186
Revert "Changes to have only one Actions Interactor per ActorProxyFac…
shalabhms Aug 27, 2019
47ebf2d
Adding Remote Exception handling
shalabhms Aug 28, 2019
6464706
Merge branch 'shalabhs/oneInteractor' into sdk_v1
shalabhms Aug 28, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 9 additions & 30 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,35 +30,6 @@ stages:
command: 'test'
arguments: '--configuration $(Configuration)'
projects: 'code.sln'
- task: EsrpCodeSigning@1
displayName: 'ESRP CodeSign'
condition: and(eq(variables['Configuration'], 'release'), or(contains(variables['Build.SourceBranch'], 'refs/heads/master'), contains(variables['Build.SourceBranch'], 'refs/heads/release')))
inputs:
ConnectedServiceName: 'ActionsSigning'
FolderPath: 'bin/$(Configuration)'
Pattern: 'Microsoft.Actions*.dll'
UseMinimatch: true
signConfigType: 'inlineSignParams'
inlineOperation: |
[
{
"keyCode": "$(ESRP_CODESIGN_KEYCODE)",
"operationSetCode": "StrongNameSign",
"parameters": [ ],
"toolName": "sign",
"toolVersion": "1.0"
},
{
"keyCode": "$(ESRP_CODESIGN_KEYCODE)",
"operationSetCode": "StrongNameVerify",
"parameters": [ ],
"toolName": "sign",
"toolVersion": "1.0"
}
]
SessionTimeout: '20'
MaxConcurrency: '50'
MaxRetryAttempts: '5'
- task: EsrpCodeSigning@1
displayName: 'ESRP Authenticode CodeSign'
condition: and(eq(variables['Configuration'], 'release'), or(contains(variables['Build.SourceBranch'], 'refs/heads/master'), contains(variables['Build.SourceBranch'], 'refs/heads/release')))
Expand Down Expand Up @@ -109,13 +80,21 @@ stages:
MaxConcurrency: '50'
MaxRetryAttempts: '5'
- task: DotNetCoreCLI@2
displayName: 'Package nuget - $(Configuration)'
displayName: 'Package Microsoft.Actions.Actors nuget - $(Configuration)'
inputs:
command: 'pack'
arguments: '--configuration $(Configuration)'
packagesToPack: 'src/Microsoft.Actions.Actors/Microsoft.Actions.Actors.csproj'
nobuild: true
versioningScheme: 'off'
- task: DotNetCoreCLI@2
displayName: 'Package Microsoft.Actions.Actors.AspNetCore nuget - $(Configuration)'
inputs:
command: 'pack'
arguments: '--configuration $(Configuration)'
packagesToPack: 'src/Microsoft.Actions.Actors.AspNetCore/Microsoft.Actions.Actors.AspNetCore.csproj'
nobuild: true
versioningScheme: 'off'
- task: EsrpCodeSigning@1
displayName: 'ESRP CodeSign - Nuget Package'
condition: and(eq(variables['Configuration'], 'release'), or(contains(variables['Build.SourceBranch'], 'refs/heads/master'), contains(variables['Build.SourceBranch'], 'refs/heads/release')))
Expand Down
62 changes: 37 additions & 25 deletions code.sln
Original file line number Diff line number Diff line change
@@ -1,25 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.645
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Actions.Actors", "src\Microsoft.Actions.Actors\Microsoft.Actions.Actors.csproj", "{C2DB4B64-B7C3-4FED-8753-C040F677C69A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.645
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Actions.Actors", "src\Microsoft.Actions.Actors\Microsoft.Actions.Actors.csproj", "{C2DB4B64-B7C3-4FED-8753-C040F677C69A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Actions.Actors.Test", "test\Microsoft.Actions.Actors.Test\Microsoft.Actions.Actors.Test.csproj", "{41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Actions.Actors.AspNetCore", "src\Microsoft.Actions.Actors.AspNetCore\Microsoft.Actions.Actors.AspNetCore.csproj", "{B9C12532-0969-4DAC-A2F8-CA9208D7A901}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|Any CPU.Build.0 = Release|Any CPU
{41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|Any CPU.Build.0 = Release|Any CPU
{B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
EndGlobalSection
EndGlobal
Binary file removed properties/Key.snk
Binary file not shown.
2 changes: 1 addition & 1 deletion properties/actions_common.props
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<MinorVersion>0</MinorVersion>
<BuildVersion>0</BuildVersion>
<Revision>0</Revision>
<PreviewTag>-preview001</PreviewTag>
<PreviewTag>-preview01</PreviewTag>

<Version>$(MajorVersion).$(MinorVersion).$(BuildVersion).$(Revision)</Version>
<AssemblyVersion>$(Version)</AssemblyVersion>
Expand Down
3 changes: 1 addition & 2 deletions properties/actions_managed_netstandard.props
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@
<!-- Enable delay signing with Key.snk -->
<PropertyGroup>
<SignAssembly>true</SignAssembly>
<DelaySign>true</DelaySign>
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)Key.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)cs_sdk.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<PropertyGroup>
Expand Down
Binary file added properties/cs_sdk.snk
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See License.txt in the repo root for license information.
// ------------------------------------------------------------

namespace Microsoft.Actions.Actors.AspNetCore
{
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Routing;

internal class ActionsActorSetupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
// Adds routes for Actors interaction.
return app =>
{
var actorRouteBuilder = new RouteBuilder(app);
actorRouteBuilder.AddActionsConfigRoute();
actorRouteBuilder.AddGetSupportedActorTypesRoute();
actorRouteBuilder.AddActorActivationRoute();
actorRouteBuilder.AddActorDeactivationRoute();
actorRouteBuilder.AddActorMethodRoute();
actorRouteBuilder.AddReminderRoute();
actorRouteBuilder.AddTimerRoute();

app.UseRouter(actorRouteBuilder.Build());
next(app);
};
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\properties\actions_managed_netstandard.props" />
<Import Project="..\..\properties\actions_managed_stylecop.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Microsoft.Actions.Actors.AspNetCore</AssemblyName>
<RootNamespace>$(AssemblyName)</RootNamespace>
<DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>

<!-- Nuget package properties when packed using dotnet pack. -->
<NuspecFile>nuspec\Microsoft.Actions.Actors.AspNetCore.nuspec</NuspecFile>
<NuspecProperties>version=$(NupkgVersion);Configuration=$(Configuration)</NuspecProperties>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Routing" Version="2.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Microsoft.Actions.Actors\Microsoft.Actions.Actors.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="StyleCop.Analyzers" Version="1.1.118">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Compile Update="Resources\SR.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>SR.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources\SR.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>SR.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>

</Project>
118 changes: 118 additions & 0 deletions src/Microsoft.Actions.Actors.AspNetCore/RouterBuilderExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See License.txt in the repo root for license information.
// ------------------------------------------------------------

namespace Microsoft.Actions.Actors.AspNetCore
{
using System.Linq;
using Microsoft.Actions.Actors.Runtime;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Newtonsoft.Json.Linq;

internal static class RouterBuilderExtensions
{
public static void AddActionsConfigRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapGet("actions/config", (request, response, routeData) =>
{
var result = new JObject(
new JProperty("entities", new JArray(ActorRuntime.RegisteredActorTypes.Select(actorType => new JValue(actorType)))));

return response.WriteAsync(result.ToString());
});
}

public static void AddGetSupportedActorTypesRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapGet("actors", (request, response, routeData) =>
{
var result = new JObject(
new JProperty("entities", new JArray(ActorRuntime.RegisteredActorTypes.Select(actorType => new JValue(actorType)))));

return response.WriteAsync(result.ToString());
});
}

public static void AddActorActivationRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapPost("actors/{actorTypeName}/{actorId}", (request, response, routeData) =>
{
var actorTypeName = (string)routeData.Values["actorTypeName"];
var actorId = (string)routeData.Values["actorId"];
return ActorRuntime.ActivateAsync(actorTypeName, actorId);
});
}

public static void AddActorDeactivationRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapDelete("actors/{actorTypeName}/{actorId}", (request, response, routeData) =>
{
var actorTypeName = (string)routeData.Values["actorTypeName"];
var actorId = (string)routeData.Values["actorId"];
return ActorRuntime.DeactivateAsync(actorTypeName, actorId);
});
}

public static void AddActorMethodRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapPut("actors/{actorTypeName}/{actorId}/method/{methodName}", (request, response, routeData) =>
{
var actorTypeName = (string)routeData.Values["actorTypeName"];
var actorId = (string)routeData.Values["actorId"];
var methodName = (string)routeData.Values["methodName"];

// If Header is present, call is made using Remoting, use Remoting dispatcher.
if (request.Headers.ContainsKey(Constants.RequestHeaderName))
{
var actionsActorheader = request.Headers[Constants.RequestHeaderName];
return ActorRuntime.DispatchWithRemotingAsync(actorTypeName, actorId, methodName, actionsActorheader, request.Body)
.ContinueWith(async t =>
{
var result = t.GetAwaiter().GetResult();

// Item 1 is header , Item 2 is body
if (result.Item1 != string.Empty)
{
// exception case
response.Headers.Add(Constants.ErrorResponseHeaderName, result.Item1); // add error header
}

await response.Body.WriteAsync(result.Item2, 0, result.Item2.Length); // add response message body
});
}
else
{
return ActorRuntime.DispatchWithoutRemotingAsync(actorTypeName, actorId, methodName, request.Body, response.Body);
}
});
}

public static void AddReminderRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapPut("actors/{actorTypeName}/{actorId}/method/remind/{reminderName}", (request, response, routeData) =>
{
var actorTypeName = (string)routeData.Values["actorTypeName"];
var actorId = (string)routeData.Values["actorId"];
var reminderName = (string)routeData.Values["reminderName"];

// read dueTime, period and data from Request Body.
return ActorRuntime.FireReminderAsync(actorTypeName, actorId, reminderName, request.Body);
});
}

public static void AddTimerRoute(this IRouteBuilder routeBuilder)
{
routeBuilder.MapPut("actors/{actorTypeName}/{actorId}/method/timer/{timerName}", (request, response, routeData) =>
{
var actorTypeName = (string)routeData.Values["actorTypeName"];
var actorId = (string)routeData.Values["actorId"];
var timerName = (string)routeData.Values["timerName"];

// read dueTime, period and data from Request Body.
return ActorRuntime.FireTimerAsync(actorTypeName, actorId, timerName);
});
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See License.txt in the repo root for license information.
// ------------------------------------------------------------

namespace Microsoft.Actions.Actors.AspNetCore
{
using System;
using Microsoft.Actions.Actors.Runtime;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

/// <summary>
/// Class containing ActionsActor related extension methods for Microsoft.AspNetCore.Hosting.IWebHostBuilder.
/// </summary>
public static class WebHostBuilderExtensions
{
private static readonly string SettingName = "UseActionsActors";

/// <summary>
/// Configures the service to use the routes needed by Actions Actor runtime.
/// </summary>
/// <param name="hostBuilder">The Microsoft.AspNetCore.Hosting.IWebHostBuilder to configure.</param>
/// <param name="configureActorRuntime">Adds a delegate to configure Actor runtime..</param>
/// <returns>The Microsoft.AspNetCore.Hosting.IWebHostBuilder.</returns>
public static IWebHostBuilder UseActionsActors(this IWebHostBuilder hostBuilder, Action<ActorRuntime> configureActorRuntime)
{
if (hostBuilder == null)
{
throw new ArgumentNullException("hostBuilder");
}

// Check if 'UseServiceFabricIntegration' has already been called.
if (hostBuilder.GetSetting(SettingName) != null && hostBuilder.GetSetting(SettingName).Equals(true.ToString(), StringComparison.Ordinal))
{
return hostBuilder;
}

configureActorRuntime.Invoke(ActorRuntime.Instance);

// Set flag to prevent double service configuration
hostBuilder.UseSetting(SettingName, true.ToString());

hostBuilder.ConfigureServices(services =>
{
// Add routes.
services.AddRouting();
services.AddSingleton<IStartupFilter>(new ActionsActorSetupFilter());
});

return hostBuilder;
}
}
}
Loading