diff --git a/src/Squidex.Domain.Apps.Read/State/AppProvider.cs b/src/Squidex.Domain.Apps.Read/State/AppProvider.cs index 935d0708e..d5e59c937 100644 --- a/src/Squidex.Domain.Apps.Read/State/AppProvider.cs +++ b/src/Squidex.Domain.Apps.Read/State/AppProvider.cs @@ -13,11 +13,11 @@ using System.Threading.Tasks; using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Rules; using Squidex.Domain.Apps.Read.Schemas; -using Squidex.Domain.Apps.Read.State.Orleans.Grains; +using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Infrastructure; using Squidex.Infrastructure.States; -namespace Squidex.Domain.Apps.Read.State.Orleans +namespace Squidex.Domain.Apps.Read.State { public sealed class AppProvider : IAppProvider { diff --git a/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs b/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs index 48e4c1678..718cd22fb 100644 --- a/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs +++ b/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs @@ -9,13 +9,13 @@ using System.Threading.Tasks; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Apps; -using Squidex.Domain.Apps.Read.State.Orleans.Grains; +using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; -namespace Squidex.Domain.Apps.Read.State.Orleans +namespace Squidex.Domain.Apps.Read.State { public sealed class AppStateEventConsumer : IEventConsumer { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs index 27c9b5e22..b32b7539e 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs @@ -19,7 +19,7 @@ using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public class AppStateGrain : StatefulObject { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs index 3d777f420..c84f51a52 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs @@ -17,7 +17,7 @@ using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Dispatching; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed partial class AppStateGrainState { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs index 701f85cb6..cd17d3e72 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs @@ -15,7 +15,7 @@ using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Reflection; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed partial class AppStateGrainState { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs index 53f0e9a82..ad6159f20 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs @@ -11,7 +11,7 @@ using Squidex.Domain.Apps.Events.Rules; using Squidex.Domain.Apps.Events.Rules.Utils; using Squidex.Infrastructure.CQRS.Events; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed partial class AppStateGrainState { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs index dfb772b9d..2f919d859 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs @@ -16,7 +16,7 @@ using Squidex.Infrastructure.Reflection; #pragma warning disable CS0612 // Type or member is obsolete -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed partial class AppStateGrainState { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrain.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrain.cs index 1626d4314..26e43cb4a 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrain.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrain.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed class AppUserGrain : StatefulObject { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrainState.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrainState.cs index 216b6c51d..823969670 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrainState.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppUserGrainState.cs @@ -9,7 +9,7 @@ using System.Collections.Generic; using Newtonsoft.Json; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed class AppUserGrainState { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/JsonAppEntity.cs b/src/Squidex.Domain.Apps.Read/State/Grains/JsonAppEntity.cs index 306a9a05e..fbe491584 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/JsonAppEntity.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/JsonAppEntity.cs @@ -10,7 +10,7 @@ using Newtonsoft.Json; using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Read.Apps; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed class JsonAppEntity : JsonEntity, IAppEntity { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/JsonEntity.cs b/src/Squidex.Domain.Apps.Read/State/Grains/JsonEntity.cs index 0cf3ba63b..94d38176e 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/JsonEntity.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/JsonEntity.cs @@ -11,7 +11,7 @@ using Newtonsoft.Json; using NodaTime; using Squidex.Infrastructure; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public abstract class JsonEntity : Cloneable, IUpdateableEntityWithVersion where T : Cloneable { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/JsonRuleEntity.cs b/src/Squidex.Domain.Apps.Read/State/Grains/JsonRuleEntity.cs index 3ddf988c4..287d1b2ab 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/JsonRuleEntity.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/JsonRuleEntity.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Read.Rules; using Squidex.Infrastructure; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed class JsonRuleEntity : JsonEntity, diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/JsonSchemaEntity.cs b/src/Squidex.Domain.Apps.Read/State/Grains/JsonSchemaEntity.cs index 346a59054..004467008 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/JsonSchemaEntity.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/JsonSchemaEntity.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure; -namespace Squidex.Domain.Apps.Read.State.Orleans.Grains +namespace Squidex.Domain.Apps.Read.State.Grains { public sealed class JsonSchemaEntity : JsonEntity, diff --git a/src/Squidex.Infrastructure/CQRS/Events/Actors/EventConsumerActorManager.cs b/src/Squidex.Infrastructure/CQRS/Events/Actors/EventConsumerActorManager.cs index 9045748f0..864e25a50 100644 --- a/src/Squidex.Infrastructure/CQRS/Events/Actors/EventConsumerActorManager.cs +++ b/src/Squidex.Infrastructure/CQRS/Events/Actors/EventConsumerActorManager.cs @@ -39,7 +39,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Actors foreach (var consumer in consumers) { - var actor = factory.GetAsync(consumer.Name).Result; + var actor = factory.GetDetachedAsync(consumer.Name).Result; actors[consumer.Name] = actor; actor.Activate(consumer); diff --git a/src/Squidex.Infrastructure/States/IStateFactory.cs b/src/Squidex.Infrastructure/States/IStateFactory.cs index 1c238f0ed..7589be28f 100644 --- a/src/Squidex.Infrastructure/States/IStateFactory.cs +++ b/src/Squidex.Infrastructure/States/IStateFactory.cs @@ -13,5 +13,7 @@ namespace Squidex.Infrastructure.States public interface IStateFactory { Task GetAsync(string key) where T : StatefulObject; + + Task GetDetachedAsync(string key) where T : StatefulObject; } } diff --git a/src/Squidex.Infrastructure/States/StateFactory.cs b/src/Squidex.Infrastructure/States/StateFactory.cs index e6d86bf9c..7d17dab27 100644 --- a/src/Squidex.Infrastructure/States/StateFactory.cs +++ b/src/Squidex.Infrastructure/States/StateFactory.cs @@ -50,6 +50,18 @@ namespace Squidex.Infrastructure.States }); } + public async Task GetDetachedAsync(string key) where T : StatefulObject + { + Guard.NotNull(key, nameof(key)); + + var stateHolder = new StateHolder(key, () => { }, store); + var state = (T)services.GetService(typeof(T)); + + await state.ActivateAsync(stateHolder); + + return state; + } + public Task GetAsync(string key) where T : StatefulObject { Guard.NotNull(key, nameof(key)); diff --git a/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs b/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs index 7750dd4fb..d50ce6144 100644 --- a/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs +++ b/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs @@ -131,8 +131,7 @@ namespace Squidex.Areas.IdentityServer.Config ClientSecrets = new List { new Secret(Constants.InternalClientSecret) }, RedirectUris = new List { - urlsOptions.BuildUrl($"{Constants.PortalPrefix}/signin-oidc", false), - urlsOptions.BuildUrl($"{Constants.OrleansPrefix}/signin-oidc", false) + urlsOptions.BuildUrl($"{Constants.PortalPrefix}/signin-oidc", false) }, AccessTokenLifetime = (int)TimeSpan.FromDays(30).TotalSeconds, AllowedGrantTypes = GrantTypes.ImplicitAndClientCredentials, diff --git a/src/Squidex/Areas/Portal/Startup.cs b/src/Squidex/Areas/Portal/Startup.cs index f7ccf7a48..1591b0dfd 100644 --- a/src/Squidex/Areas/Portal/Startup.cs +++ b/src/Squidex/Areas/Portal/Startup.cs @@ -16,11 +16,11 @@ namespace Squidex.Areas.Portal { public static void ConfigurePortal(this IApplicationBuilder app) { - app.Map(Constants.PortalPrefix, orleansApp => + app.Map(Constants.PortalPrefix, portalApp => { - orleansApp.UseAuthentication(); - orleansApp.UseMiddleware(); - orleansApp.UseMiddleware(); + portalApp.UseAuthentication(); + portalApp.UseMiddleware(); + portalApp.UseMiddleware(); }); } } diff --git a/src/Squidex/Config/Constants.cs b/src/Squidex/Config/Constants.cs index 1ca87331e..5ae1e7e59 100644 --- a/src/Squidex/Config/Constants.cs +++ b/src/Squidex/Config/Constants.cs @@ -20,8 +20,6 @@ namespace Squidex.Config public static readonly string PortalPrefix = "/portal"; - public static readonly string OrleansPrefix = "/orleans"; - public static readonly string RoleScope = "role"; public static readonly string ProfileScope = "squidex-profile"; diff --git a/src/Squidex/Config/Domain/ReadServices.cs b/src/Squidex/Config/Domain/ReadServices.cs index 19c646379..61e1c62bb 100644 --- a/src/Squidex/Config/Domain/ReadServices.cs +++ b/src/Squidex/Config/Domain/ReadServices.cs @@ -24,8 +24,8 @@ using Squidex.Domain.Apps.Read.Contents.GraphQL; using Squidex.Domain.Apps.Read.History; using Squidex.Domain.Apps.Read.Rules; using Squidex.Domain.Apps.Read.Schemas; -using Squidex.Domain.Apps.Read.State.Orleans; -using Squidex.Domain.Apps.Read.State.Orleans.Grains; +using Squidex.Domain.Apps.Read.State; +using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Domain.Users; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; diff --git a/tests/Benchmarks/Tests/ReadSchemaState.cs b/tests/Benchmarks/Tests/ReadSchemaState.cs index e12dcfa33..69916636f 100644 --- a/tests/Benchmarks/Tests/ReadSchemaState.cs +++ b/tests/Benchmarks/Tests/ReadSchemaState.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.Actions; using Squidex.Domain.Apps.Core.Rules.Triggers; using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Domain.Apps.Read.State.Orleans.Grains; +using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Infrastructure; using Squidex.Infrastructure.States; diff --git a/tests/Benchmarks/Tests/TestData/MyAppState.cs b/tests/Benchmarks/Tests/TestData/MyAppState.cs index 4dd6c0d8f..5f4320cce 100644 --- a/tests/Benchmarks/Tests/TestData/MyAppState.cs +++ b/tests/Benchmarks/Tests/TestData/MyAppState.cs @@ -1,12 +1,12 @@ // ========================================================================== -// ReadSchemaState.cs +// MyAppState.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== -using Squidex.Domain.Apps.Read.State.Orleans.Grains; +using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Infrastructure.States; namespace Benchmarks.Tests.TestData diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs b/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs index 6f45d0c78..d57cbf030 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs +++ b/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs @@ -33,8 +33,8 @@ namespace Squidex.Infrastructure.CQRS.Events.Actors A.CallTo(() => consumer1.Name).Returns(consumerName1); A.CallTo(() => consumer2.Name).Returns(consumerName2); - A.CallTo(() => factory.GetAsync(consumerName1)).Returns(actor1); - A.CallTo(() => factory.GetAsync(consumerName2)).Returns(actor2); + A.CallTo(() => factory.GetDetachedAsync(consumerName1)).Returns(actor1); + A.CallTo(() => factory.GetDetachedAsync(consumerName2)).Returns(actor2); sut = new EventConsumerActorManager(new IEventConsumer[] { consumer1, consumer2 }, pubSub, factory); } diff --git a/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs b/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs index 47656e0dd..ba712b1b6 100644 --- a/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs +++ b/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs @@ -125,6 +125,16 @@ namespace Squidex.Infrastructure.States Assert.True(actual.IsDisposed); } + [Fact] + public async Task Should_not_dispose_detached_when_message_sent() + { + var actual = await sut.GetDetachedAsync(key); + + await InvalidateCacheAsync(); + + Assert.False(actual.IsDisposed); + } + [Fact] public async Task Should_dispose_states_if_exired() { @@ -135,6 +145,16 @@ namespace Squidex.Infrastructure.States Assert.True(actual.IsDisposed); } + [Fact] + public async Task Should_not_dispose_detached_states_if_exired() + { + var actual = await sut.GetDetachedAsync(key); + + await RemoveFromCacheAsync(); + + Assert.False(actual.IsDisposed); + } + [Fact] public async Task Should_dispose_states_if_disposed() { @@ -145,6 +165,16 @@ namespace Squidex.Infrastructure.States Assert.True(actual.IsDisposed); } + [Fact] + public async Task Should_not_dispose_detached_states_if_disposed() + { + var actual = await sut.GetDetachedAsync(key); + + sut.Dispose(); + + Assert.False(actual.IsDisposed); + } + private async Task RemoveFromCacheAsync() { cache.Remove(key);