From cf8f16a9ca6f9332f572121a11e3e98b8ac03a4a Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Tue, 30 Jul 2024 18:32:46 -0300 Subject: [PATCH] Split server-only (grains) APIs to our Server package Related codegen is also moved there, with a detection for the project having the server package installed. Due to an issue with Orleans codec generation (see https://github.com/dotnet/orleans/issues/9092), end to end tests are failing since state is not being properly serialized for actor messages. We can only ship this rework once that's fixed. Otherwise, we'll need to move serialization codegen back to the actor/domain project (which unfortunately brings a larger dependency on Orleans, which is undesirable). --- CloudActors.sln | 4 +- .../ActorMessageGenerator.cs | 10 ++- .../ActorStateGenerator.cs | 8 +-- .../AnalysisExtensions.cs | 19 ++++-- .../CloudActors.CodeAnalysis.csproj | 4 ++ .../CloudActorsGenerator.cs | 25 ++++++++ .../ActorGrain.sbntxt | 0 .../ActorGrainGenerator.cs | 14 +---- .../ActorsAssemblyGenerator.cs | 62 +++++++++++++++++++ .../CloudActors.Server.CodeAnalysis.csproj} | 4 +- .../Devlooped.CloudActors.Server.targets | 11 ++++ .../OrleansGenerator.cs | 15 +++-- .../Properties/launchSettings.json | 8 +++ .../ActorStateFactory.cs | 11 ++-- .../CloudActors.Server.csproj} | 6 +- .../CloudActorsExtensions.cs | 0 .../IActorGrain.cs | 0 .../IActorPersistentState.cs | 0 .../OrleansActorBus.cs | 0 .../CloudActors.Streamstone.csproj | 4 +- src/CloudActors/CloudActors.csproj | 3 +- src/TestDomain/TestDomain.csproj | 6 +- src/Tests/Tests.csproj | 8 ++- 23 files changed, 173 insertions(+), 49 deletions(-) create mode 100644 src/CloudActors.CodeAnalysis/CloudActorsGenerator.cs rename src/{CloudActors.Orleans.CodeAnalysis => CloudActors.Server.CodeAnalysis}/ActorGrain.sbntxt (100%) rename src/{CloudActors.Orleans.CodeAnalysis => CloudActors.Server.CodeAnalysis}/ActorGrainGenerator.cs (86%) create mode 100644 src/CloudActors.Server.CodeAnalysis/ActorsAssemblyGenerator.cs rename src/{CloudActors.Orleans.CodeAnalysis/CloudActors.Orleans.CodeAnalysis.csproj => CloudActors.Server.CodeAnalysis/CloudActors.Server.CodeAnalysis.csproj} (92%) create mode 100644 src/CloudActors.Server.CodeAnalysis/Devlooped.CloudActors.Server.targets rename src/{CloudActors.CodeAnalysis => CloudActors.Server.CodeAnalysis}/OrleansGenerator.cs (88%) create mode 100644 src/CloudActors.Server.CodeAnalysis/Properties/launchSettings.json rename src/{CloudActors.Orleans => CloudActors.Server}/ActorStateFactory.cs (92%) rename src/{CloudActors.Orleans/CloudActors.Orleans.csproj => CloudActors.Server/CloudActors.Server.csproj} (67%) rename src/{CloudActors.Orleans => CloudActors.Server}/CloudActorsExtensions.cs (100%) rename src/{CloudActors.Orleans => CloudActors.Server}/IActorGrain.cs (100%) rename src/{CloudActors.Orleans => CloudActors.Server}/IActorPersistentState.cs (100%) rename src/{CloudActors.Orleans => CloudActors.Server}/OrleansActorBus.cs (100%) diff --git a/CloudActors.sln b/CloudActors.sln index 0bdd161..eaec348 100644 --- a/CloudActors.sln +++ b/CloudActors.sln @@ -13,7 +13,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudActors.CodeFix", "src\ EndProject Project("{13B669BE-BB05-4DDF-9536-439F39A36129}") = "CloudActors.Package", "src\CloudActors.Package\CloudActors.Package.msbuildproj", "{22150004-BDDD-4C7E-9E42-0B5A2EC48268}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudActors.Orleans", "src\CloudActors.Orleans\CloudActors.Orleans.csproj", "{F4256D7D-262F-401A-BFD1-C27F863FE5E1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudActors.Server", "src\CloudActors.Server\CloudActors.Server.csproj", "{F4256D7D-262F-401A-BFD1-C27F863FE5E1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudActors.Streamstone", "src\CloudActors.Streamstone\CloudActors.Streamstone.csproj", "{67E7E202-1AC7-477C-AE90-E7D7C04FF6DC}" EndProject @@ -26,7 +26,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDomain", "src\TestDomain\TestDomain.csproj", "{1D75C6E9-C4E9-44D8-B598-3A2D45C25EE6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CloudActors.Orleans.CodeAnalysis", "src\CloudActors.Orleans.CodeAnalysis\CloudActors.Orleans.CodeAnalysis.csproj", "{68823E7F-269E-4947-8E2B-9905F163C96B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudActors.Server.CodeAnalysis", "src\CloudActors.Server.CodeAnalysis\CloudActors.Server.CodeAnalysis.csproj", "{68823E7F-269E-4947-8E2B-9905F163C96B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/CloudActors.CodeAnalysis/ActorMessageGenerator.cs b/src/CloudActors.CodeAnalysis/ActorMessageGenerator.cs index 0c2d5f6..7e4d650 100644 --- a/src/CloudActors.CodeAnalysis/ActorMessageGenerator.cs +++ b/src/CloudActors.CodeAnalysis/ActorMessageGenerator.cs @@ -64,9 +64,15 @@ namespace {{ns}} } """; - var orleans = OrleansGenerator.GenerateCode(options, output, message.Name, ctx.CancellationToken); ctx.AddSource($"{message.ToFileName()}.Serializable.cs", output); - ctx.AddSource($"{message.ToFileName()}.Serializable.orleans.cs", orleans); + + // This supports the scenario where the actor and messages exist in the server project itself, + // which is likely not very common but nevertheless it should be supported. + if (options.IsCloudActorsServer) + { + var orleans = OrleansGenerator.GenerateCode(options, output, message.Name, ctx.CancellationToken); + ctx.AddSource($"{message.ToFileName()}.Serializable.orleans.cs", orleans); + } } } \ No newline at end of file diff --git a/src/CloudActors.CodeAnalysis/ActorStateGenerator.cs b/src/CloudActors.CodeAnalysis/ActorStateGenerator.cs index 8b86247..a184ba2 100644 --- a/src/CloudActors.CodeAnalysis/ActorStateGenerator.cs +++ b/src/CloudActors.CodeAnalysis/ActorStateGenerator.cs @@ -18,15 +18,12 @@ public class ActorStateGenerator : IIncrementalGenerator public void Initialize(IncrementalGeneratorInitializationContext context) { - var options = context.GetOrleansOptions(); - var actors = context.CompilationProvider .SelectMany((x, _) => x.Assembly.GetAllTypes().OfType()) .Where(x => x.GetAttributes().Any(x => x.IsActor())); - context.RegisterImplementationSourceOutput(actors.Combine(options), (ctx, source) => + context.RegisterImplementationSourceOutput(actors, (ctx, actor) => { - var (actor, options) = source; var ns = actor.ContainingNamespace.ToDisplayString(); var props = actor.GetMembers() @@ -59,10 +56,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) EventSourced: es); var output = template.Render(model, member => member.Name); - var orleans = OrleansGenerator.GenerateCode(options, output, $"{actor.Name}.State", ctx.CancellationToken); - ctx.AddSource($"{actor.ToFileName()}.State.cs", output); - ctx.AddSource($"{actor.ToFileName()}.State.orleans.cs", orleans); } }); } diff --git a/src/CloudActors.CodeAnalysis/AnalysisExtensions.cs b/src/CloudActors.CodeAnalysis/AnalysisExtensions.cs index dc2e55e..814c705 100644 --- a/src/CloudActors.CodeAnalysis/AnalysisExtensions.cs +++ b/src/CloudActors.CodeAnalysis/AnalysisExtensions.cs @@ -13,15 +13,26 @@ public static class AnalysisExtensions genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, miscellaneousOptions: SymbolDisplayMiscellaneousOptions.ExpandNullable); - public static IEnumerable GetAllTypes(this IAssemblySymbol assembly) + public static IEnumerable GetAllTypes(this Compilation compilation, bool includeReferenced = true) + => compilation.Assembly + .GetAllTypes() + .OfType() + .Concat(compilation.GetUsedAssemblyReferences() + .SelectMany(r => + { + if (compilation.GetAssemblyOrModuleSymbol(r) is IAssemblySymbol asm) + return asm.GetAllTypes().OfType(); + + return []; + })); + + public static IEnumerable GetAllTypes(this IAssemblySymbol assembly) => GetAllTypes(assembly.GlobalNamespace); - static IEnumerable GetAllTypes(INamespaceSymbol namespaceSymbol) + static IEnumerable GetAllTypes(INamespaceSymbol namespaceSymbol) { foreach (var typeSymbol in namespaceSymbol.GetTypeMembers()) - { yield return typeSymbol; - } foreach (var childNamespace in namespaceSymbol.GetNamespaceMembers()) { diff --git a/src/CloudActors.CodeAnalysis/CloudActors.CodeAnalysis.csproj b/src/CloudActors.CodeAnalysis/CloudActors.CodeAnalysis.csproj index 6094c1a..bb6c0b8 100644 --- a/src/CloudActors.CodeAnalysis/CloudActors.CodeAnalysis.csproj +++ b/src/CloudActors.CodeAnalysis/CloudActors.CodeAnalysis.csproj @@ -13,6 +13,10 @@ true + + + + diff --git a/src/CloudActors.CodeAnalysis/CloudActorsGenerator.cs b/src/CloudActors.CodeAnalysis/CloudActorsGenerator.cs new file mode 100644 index 0000000..cf03ade --- /dev/null +++ b/src/CloudActors.CodeAnalysis/CloudActorsGenerator.cs @@ -0,0 +1,25 @@ +using Microsoft.CodeAnalysis; + +namespace Devlooped.CloudActors; + +[Generator(LanguageNames.CSharp)] +public class CloudActorsGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterImplementationSourceOutput(context.CompilationProvider, (ctx, compilation) => + { + ctx.AddSource($"CloudActors.cs", + $$""" + // + [assembly: Devlooped.CloudActors] + + namespace Devlooped + { + [System.AttributeUsage(System.AttributeTargets.Assembly)] + class CloudActorsAttribute : System.Attribute { } + } + """); + }); + } +} diff --git a/src/CloudActors.Orleans.CodeAnalysis/ActorGrain.sbntxt b/src/CloudActors.Server.CodeAnalysis/ActorGrain.sbntxt similarity index 100% rename from src/CloudActors.Orleans.CodeAnalysis/ActorGrain.sbntxt rename to src/CloudActors.Server.CodeAnalysis/ActorGrain.sbntxt diff --git a/src/CloudActors.Orleans.CodeAnalysis/ActorGrainGenerator.cs b/src/CloudActors.Server.CodeAnalysis/ActorGrainGenerator.cs similarity index 86% rename from src/CloudActors.Orleans.CodeAnalysis/ActorGrainGenerator.cs rename to src/CloudActors.Server.CodeAnalysis/ActorGrainGenerator.cs index e7c13d7..6ccf505 100644 --- a/src/CloudActors.Orleans.CodeAnalysis/ActorGrainGenerator.cs +++ b/src/CloudActors.Server.CodeAnalysis/ActorGrainGenerator.cs @@ -17,18 +17,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context) var options = context.GetOrleansOptions(); var actors = context.CompilationProvider - .SelectMany((x, _) => x.Assembly - .GetAllTypes() - .OfType() - .Where(t => t.IsActor()) - .Concat(x.GetUsedAssemblyReferences() - .SelectMany(r => - { - if (x.GetAssemblyOrModuleSymbol(r) is IAssemblySymbol asm) - return asm.GetAllTypes().OfType().Where(t => t.IsActor()); - - return []; - }))); + .SelectMany((x, _) => x.GetAllTypes()) + .Where(t => t.IsActor()); context.RegisterImplementationSourceOutput(actors.Combine(options), (ctx, source) => { diff --git a/src/CloudActors.Server.CodeAnalysis/ActorsAssemblyGenerator.cs b/src/CloudActors.Server.CodeAnalysis/ActorsAssemblyGenerator.cs new file mode 100644 index 0000000..0e226e1 --- /dev/null +++ b/src/CloudActors.Server.CodeAnalysis/ActorsAssemblyGenerator.cs @@ -0,0 +1,62 @@ +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis; +using static Devlooped.CloudActors.AnalysisExtensions; + +namespace Devlooped.CloudActors; + +/// +/// Analyzes referenced assemblies from current compilation and emits an attribute +/// for each one that instructs the Orleans code generator to inspect the assembly +/// and generate code for it: GenerateCodeForDeclaringAssembly. +/// This allows us to avoid polluting the domain/actor assemblies with Orleans-specifics +/// other than the [GenerateSerializer] attribute and state classes, but which have no +/// implementations. Grains and everything else are generated in the project referencing +/// the Orleans.Server package only. +/// +[Generator(LanguageNames.CSharp)] +public class ActorsAssemblyGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + var options = context.GetOrleansOptions(); + var assemblies = context.CompilationProvider + .SelectMany((x, _) => x.GetUsedAssemblyReferences().Select(r => new { Compilation = x, Reference = r })) + .Select((x, _) => x.Compilation.GetAssemblyOrModuleSymbol(x.Reference)) + .Where(x => x is IAssemblySymbol asm && asm.GetAttributes().Any( + a => "Devlooped.CloudActorsAttribute".Equals(a.AttributeClass?.ToDisplayString(FullName)))) + .Select((x, _) => (IAssemblySymbol)x!) + .Collect(); + + context.RegisterImplementationSourceOutput(assemblies.Combine(options), GenerateCode); + } + + static void GenerateCode(SourceProductionContext ctx, (ImmutableArray, OrleansGeneratorOptions) source) + { + var (assemblies, options) = source; + + // Don't duplicate any of the already generated code for the current assembly + options = options with { Compilation = options.Compilation.RemoveAllSyntaxTrees() }; + + var output = new StringBuilder().AppendLine( + """ + // + using Orleans; + """); + + foreach (var type in assemblies.Select(x => x.GetAllTypes() + .FirstOrDefault(x => x.ContainingType == null && options.Compilation.IsSymbolAccessibleWithin(x, options.Compilation.Assembly)))) + { + if (type == null) + continue; + + // [assembly: GenerateCodeForDeclaringAssembly(typeof(TestDomain.Account))] + output.AppendLine($"[assembly: GenerateCodeForDeclaringAssembly(typeof({type.ToDisplayString(FullName)}))]"); + } + + var orleans = OrleansGenerator.GenerateCode(options, output.ToString(), "References", ctx.CancellationToken); + + ctx.AddSource($"CloudActors.orleans.cs", orleans); + } +} \ No newline at end of file diff --git a/src/CloudActors.Orleans.CodeAnalysis/CloudActors.Orleans.CodeAnalysis.csproj b/src/CloudActors.Server.CodeAnalysis/CloudActors.Server.CodeAnalysis.csproj similarity index 92% rename from src/CloudActors.Orleans.CodeAnalysis/CloudActors.Orleans.CodeAnalysis.csproj rename to src/CloudActors.Server.CodeAnalysis/CloudActors.Server.CodeAnalysis.csproj index 1873529..5e45407 100644 --- a/src/CloudActors.Orleans.CodeAnalysis/CloudActors.Orleans.CodeAnalysis.csproj +++ b/src/CloudActors.Server.CodeAnalysis/CloudActors.Server.CodeAnalysis.csproj @@ -1,7 +1,7 @@  - Devlooped.CloudActors.Orleans.CodeAnalysis + Devlooped.CloudActors.Server.CodeAnalysis netstandard2.0 true @@ -15,7 +15,6 @@ - @@ -40,6 +39,7 @@ + diff --git a/src/CloudActors.Server.CodeAnalysis/Devlooped.CloudActors.Server.targets b/src/CloudActors.Server.CodeAnalysis/Devlooped.CloudActors.Server.targets new file mode 100644 index 0000000..bc35064 --- /dev/null +++ b/src/CloudActors.Server.CodeAnalysis/Devlooped.CloudActors.Server.targets @@ -0,0 +1,11 @@ + + + + true + + + + + + + \ No newline at end of file diff --git a/src/CloudActors.CodeAnalysis/OrleansGenerator.cs b/src/CloudActors.Server.CodeAnalysis/OrleansGenerator.cs similarity index 88% rename from src/CloudActors.CodeAnalysis/OrleansGenerator.cs rename to src/CloudActors.Server.CodeAnalysis/OrleansGenerator.cs index e344e9e..19ee2c1 100644 --- a/src/CloudActors.CodeAnalysis/OrleansGenerator.cs +++ b/src/CloudActors.Server.CodeAnalysis/OrleansGenerator.cs @@ -13,7 +13,11 @@ namespace Devlooped.CloudActors; -public record OrleansGeneratorOptions(Compilation Compilation, CSharpParseOptions? ParseOptions, AnalyzerConfigOptions AnalyzerConfig); +public record OrleansGeneratorOptions(Compilation Compilation, CSharpParseOptions? ParseOptions, AnalyzerConfigOptions AnalyzerConfig) +{ + public bool IsCloudActorsServer => AnalyzerConfig.TryGetValue("build_property.IsCloudActorsServer", out var value) && + bool.TryParse(value, out var isServer) && isServer; +} public static class OrleansGeneratorExtensions { @@ -72,7 +76,6 @@ public static string GenerateCode(OrleansGeneratorOptions orleans, string additi var generator = new CodeGenerator(compilation, options); var syntax = generator.GenerateCode(cancellation); - // Remove all attributes like: [assembly: global::Orleans.ApplicationPartAttribute] syntax = syntax.RemoveNodes( syntax.DescendantNodes() .OfType() @@ -97,22 +100,22 @@ static CodeGeneratorOptions CreateGeneratorOptions(OrleansGeneratorOptions orlea var options = new CodeGeneratorOptions(); if (orleans.AnalyzerConfig.TryGetValue("build_property.orleans_immutableattributes", out var immutableAttributes) && immutableAttributes is { Length: > 0 }) { - options.ImmutableAttributes.AddRange(immutableAttributes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList()); + options.ImmutableAttributes.AddRange([.. immutableAttributes.Split([';'], StringSplitOptions.RemoveEmptyEntries)]); } if (orleans.AnalyzerConfig.TryGetValue("build_property.orleans_aliasattributes", out var aliasAttributes) && aliasAttributes is { Length: > 0 }) { - options.AliasAttributes.AddRange(aliasAttributes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList()); + options.AliasAttributes.AddRange([.. aliasAttributes.Split([';'], StringSplitOptions.RemoveEmptyEntries)]); } if (orleans.AnalyzerConfig.TryGetValue("build_property.orleans_idattributes", out var idAttributes) && idAttributes is { Length: > 0 }) { - options.IdAttributes.AddRange(idAttributes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList()); + options.IdAttributes.AddRange([.. idAttributes.Split([';'], StringSplitOptions.RemoveEmptyEntries)]); } if (orleans.AnalyzerConfig.TryGetValue("build_property.orleans_generateserializerattributes", out var generateSerializerAttributes) && generateSerializerAttributes is { Length: > 0 }) { - options.GenerateSerializerAttributes.AddRange(generateSerializerAttributes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList()); + options.GenerateSerializerAttributes.AddRange([.. generateSerializerAttributes.Split([';'], StringSplitOptions.RemoveEmptyEntries)]); } if (orleans.AnalyzerConfig.TryGetValue("build_property.orleans_generatefieldids", out var generateFieldIds) && generateFieldIds is { Length: > 0 }) diff --git a/src/CloudActors.Server.CodeAnalysis/Properties/launchSettings.json b/src/CloudActors.Server.CodeAnalysis/Properties/launchSettings.json new file mode 100644 index 0000000..ca7ff8c --- /dev/null +++ b/src/CloudActors.Server.CodeAnalysis/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "CodeAnalysis": { + "commandName": "DebugRoslynComponent", + "targetProject": "..\\Tests\\Tests.csproj" + } + } +} \ No newline at end of file diff --git a/src/CloudActors.Orleans/ActorStateFactory.cs b/src/CloudActors.Server/ActorStateFactory.cs similarity index 92% rename from src/CloudActors.Orleans/ActorStateFactory.cs rename to src/CloudActors.Server/ActorStateFactory.cs index 213e24e..485c1e0 100644 --- a/src/CloudActors.Orleans/ActorStateFactory.cs +++ b/src/CloudActors.Server/ActorStateFactory.cs @@ -4,10 +4,8 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using Orleans; using Orleans.Core; using Orleans.Runtime; @@ -97,10 +95,15 @@ TState IStorage.State } public Task ClearStateAsync() => persistence.ClearStateAsync() - .ContinueWith(t => Actor.SetState(persistence.State)); + .ContinueWith(t => Actor.SetState(persistence.State), TaskContinuationOptions.OnlyOnRanToCompletion); public Task ReadStateAsync() => persistence.ReadStateAsync() - .ContinueWith(t => Actor.SetState(persistence.State)); + .ContinueWith(t => + { + // Don't overwrite state that may already have initial values from actor constructor. + if (persistence.RecordExists) + Actor.SetState(persistence.State); + }, TaskContinuationOptions.OnlyOnRanToCompletion); public Task WriteStateAsync() { diff --git a/src/CloudActors.Orleans/CloudActors.Orleans.csproj b/src/CloudActors.Server/CloudActors.Server.csproj similarity index 67% rename from src/CloudActors.Orleans/CloudActors.Orleans.csproj rename to src/CloudActors.Server/CloudActors.Server.csproj index 44bb4a2..3c3e565 100644 --- a/src/CloudActors.Orleans/CloudActors.Orleans.csproj +++ b/src/CloudActors.Server/CloudActors.Server.csproj @@ -1,10 +1,10 @@ - + Devlooped.CloudActors.Server net8.0 $(AssemblyName) - Cloud Native Actors Server/Hosting + Cloud Native Actors Orleans Server/Hosting dotnet orleans actor server @@ -15,7 +15,7 @@ - + diff --git a/src/CloudActors.Orleans/CloudActorsExtensions.cs b/src/CloudActors.Server/CloudActorsExtensions.cs similarity index 100% rename from src/CloudActors.Orleans/CloudActorsExtensions.cs rename to src/CloudActors.Server/CloudActorsExtensions.cs diff --git a/src/CloudActors.Orleans/IActorGrain.cs b/src/CloudActors.Server/IActorGrain.cs similarity index 100% rename from src/CloudActors.Orleans/IActorGrain.cs rename to src/CloudActors.Server/IActorGrain.cs diff --git a/src/CloudActors.Orleans/IActorPersistentState.cs b/src/CloudActors.Server/IActorPersistentState.cs similarity index 100% rename from src/CloudActors.Orleans/IActorPersistentState.cs rename to src/CloudActors.Server/IActorPersistentState.cs diff --git a/src/CloudActors.Orleans/OrleansActorBus.cs b/src/CloudActors.Server/OrleansActorBus.cs similarity index 100% rename from src/CloudActors.Orleans/OrleansActorBus.cs rename to src/CloudActors.Server/OrleansActorBus.cs diff --git a/src/CloudActors.Streamstone/CloudActors.Streamstone.csproj b/src/CloudActors.Streamstone/CloudActors.Streamstone.csproj index dedbcd2..18c40f4 100644 --- a/src/CloudActors.Streamstone/CloudActors.Streamstone.csproj +++ b/src/CloudActors.Streamstone/CloudActors.Streamstone.csproj @@ -16,9 +16,9 @@ - - + + diff --git a/src/CloudActors/CloudActors.csproj b/src/CloudActors/CloudActors.csproj index 7ca07c7..e679f57 100644 --- a/src/CloudActors/CloudActors.csproj +++ b/src/CloudActors/CloudActors.csproj @@ -1,4 +1,4 @@ - + Devlooped.CloudActors @@ -6,6 +6,7 @@ + diff --git a/src/TestDomain/TestDomain.csproj b/src/TestDomain/TestDomain.csproj index bee3ca9..1e727b0 100644 --- a/src/TestDomain/TestDomain.csproj +++ b/src/TestDomain/TestDomain.csproj @@ -3,15 +3,19 @@ net8.0 true + + RS1036;CS8785 + + - diff --git a/src/Tests/Tests.csproj b/src/Tests/Tests.csproj index 15a6032..fca2788 100644 --- a/src/Tests/Tests.csproj +++ b/src/Tests/Tests.csproj @@ -28,13 +28,15 @@ - - - + + + + + \ No newline at end of file