Browse Source

WebHost compatibility pack.

pull/349/head
Sebastian Stehle 7 years ago
parent
commit
682bffda6f
  1. 47
      src/Squidex/Config/Orleans/EnvironmentWrapper.cs
  2. 122
      src/Squidex/Config/Orleans/OrleansServices.cs
  3. 51
      src/Squidex/Config/Orleans/SiloHost.cs
  4. 73
      src/Squidex/Config/Orleans/SiloServiceBuilder.cs

47
src/Squidex/Config/Orleans/EnvironmentWrapper.cs

@ -1,47 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using IWebHostEnvironment = Microsoft.AspNetCore.Hosting.IHostingEnvironment;
namespace Squidex.Config.Orleans
{
public sealed class EnvironmentWrapper : IHostingEnvironment
{
private readonly IWebHostEnvironment nested;
public string EnvironmentName
{
get => nested.EnvironmentName;
set => nested.EnvironmentName = value;
}
public string ApplicationName
{
get => nested.ApplicationName;
set => nested.ApplicationName = value;
}
public string ContentRootPath
{
get => nested.ContentRootPath;
set => nested.ContentRootPath = value;
}
public IFileProvider ContentRootFileProvider
{
get => nested.ContentRootFileProvider;
set => nested.ContentRootFileProvider = value;
}
public EnvironmentWrapper(IWebHostEnvironment nested)
{
this.nested = nested;
}
}
}

122
src/Squidex/Config/Orleans/OrleansServices.cs

@ -8,9 +8,11 @@
using System.Net;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Orleans;
using Orleans.Configuration;
using Orleans.Hosting;
using OrleansDashboard;
using Squidex.Domain.Apps.Entities;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Orleans;
@ -22,81 +24,83 @@ namespace Squidex.Config.Orleans
{
public static IServiceCollection AddOrleans(this IServiceCollection services, IConfiguration config, IWebHostEnvironment environment)
{
services.Configure<ClusterOptions>(options =>
services.AddOrleans(config, environment, builder =>
{
options.Configure();
});
services.Configure<ProcessExitHandlingOptions>(options =>
{
options.FastKillOnProcessExit = false;
});
builder.ConfigureServices(siloServices =>
{
siloServices.Configure<ClusterOptions>(options =>
{
options.Configure();
});
services.AddServicesForSelfHostedDashboard(null, options =>
{
options.HideTrace = true;
});
siloServices.Configure<ProcessExitHandlingOptions>(options =>
{
options.FastKillOnProcessExit = false;
});
services.AddSingleton<IIncomingGrainCallFilter, LocalCacheFilter>();
siloServices.Configure<DashboardOptions>(options =>
{
options.HideTrace = true;
});
var hostBuilder = new SiloServiceBuilder(config, environment);
siloServices.AddSingleton<IIncomingGrainCallFilter, LocalCacheFilter>();
});
hostBuilder.UseDashboard(options =>
{
options.HostSelf = false;
});
builder.ConfigureApplicationParts(parts =>
{
parts.AddApplicationPart(SquidexEntities.Assembly);
parts.AddApplicationPart(SquidexInfrastructure.Assembly);
});
hostBuilder.ConfigureApplicationParts(builder =>
{
builder.AddApplicationPart(SquidexEntities.Assembly);
builder.AddApplicationPart(SquidexInfrastructure.Assembly);
});
builder.UseDashboard(options =>
{
options.HostSelf = false;
});
var gatewayPort = config.GetOptionalValue("orleans:gatewayPort", 40000);
var gatewayPort = config.GetOptionalValue("orleans:gatewayPort", 40000);
var siloPort = config.GetOptionalValue("orleans:siloPort", 11111);
var siloPort = config.GetOptionalValue("orleans:siloPort", 11111);
config.ConfigureByOption("orleans:clustering", new Alternatives
{
["MongoDB"] = () =>
config.ConfigureByOption("orleans:clustering", new Alternatives
{
hostBuilder.ConfigureEndpoints(Dns.GetHostName(), siloPort, gatewayPort, listenOnAnyHostAddress: true);
var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration");
var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database");
hostBuilder.UseMongoDBClustering(options =>
["MongoDB"] = () =>
{
options.ConnectionString = mongoConfiguration;
options.CollectionPrefix = "Orleans_";
options.DatabaseName = mongoDatabaseName;
});
},
["Development"] = () =>
{
hostBuilder.UseLocalhostClustering(siloPort, gatewayPort, null, Constants.OrleansClusterId, Constants.OrleansClusterId);
hostBuilder.Configure<ClusterMembershipOptions>(options => options.ExpectedClusterSize = 1);
}
});
builder.ConfigureEndpoints(Dns.GetHostName(), siloPort, gatewayPort, listenOnAnyHostAddress: true);
var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration");
var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database");
builder.UseMongoDBClustering(options =>
{
options.ConnectionString = mongoConfiguration;
options.CollectionPrefix = "Orleans_";
options.DatabaseName = mongoDatabaseName;
});
},
["Development"] = () =>
{
builder.UseLocalhostClustering(siloPort, gatewayPort, null, Constants.OrleansClusterId, Constants.OrleansClusterId);
builder.Configure<ClusterMembershipOptions>(options => options.ExpectedClusterSize = 1);
}
});
config.ConfigureByOption("store:type", new Alternatives
{
["MongoDB"] = () =>
config.ConfigureByOption("store:type", new Alternatives
{
var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration");
var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database");
hostBuilder.UseMongoDBReminders(options =>
["MongoDB"] = () =>
{
options.ConnectionString = mongoConfiguration;
options.CollectionPrefix = "Orleans_";
options.DatabaseName = mongoDatabaseName;
});
}
var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration");
var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database");
builder.UseMongoDBReminders(options =>
{
options.ConnectionString = mongoConfiguration;
options.CollectionPrefix = "Orleans_";
options.DatabaseName = mongoDatabaseName;
});
}
});
});
hostBuilder.Build(services);
return services;
}

51
src/Squidex/Config/Orleans/SiloHost.cs

@ -1,51 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Orleans.Hosting;
using Squidex.Config.Startup;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Log;
namespace Squidex.Config.Orleans
{
public sealed class SiloHost : SafeHostedService
{
private readonly ISiloHost silo;
public SiloHost(ISiloHost silo, ISemanticLog log, IApplicationLifetime lifetime)
: base(lifetime, log)
{
this.silo = silo;
}
protected override async Task StartAsync(ISemanticLog log, CancellationToken ct)
{
var watch = ValueStopwatch.StartNew();
try
{
await silo.StartAsync(ct);
}
finally
{
var elapsedMs = watch.Stop();
log.LogInformation(w => w
.WriteProperty("message", "Silo started")
.WriteProperty("elapsedMs", elapsedMs));
}
}
protected override async Task StopAsync(ISemanticLog log, CancellationToken ct)
{
await silo.StopAsync();
}
}
}

73
src/Squidex/Config/Orleans/SiloServiceBuilder.cs

@ -1,73 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Orleans;
using Orleans.Hosting;
using Squidex.Infrastructure;
using HostingBuilderContext = Microsoft.Extensions.Hosting.HostBuilderContext;
using WebHostEnvironment = Microsoft.AspNetCore.Hosting.IHostingEnvironment;
namespace Squidex.Config.Orleans
{
public sealed class SiloServiceBuilder : ISiloBuilder
{
private readonly HostingBuilderContext context = new HostingBuilderContext(new Dictionary<object, object>());
private readonly List<Action<HostingBuilderContext, ISiloBuilder>> configureSiloDelegates = new List<Action<HostingBuilderContext, ISiloBuilder>>();
private readonly List<Action<HostingBuilderContext, IServiceCollection>> configureServicesDelegates = new List<Action<HostingBuilderContext, IServiceCollection>>();
public IDictionary<object, object> Properties
{
get { return context.Properties; }
}
public SiloServiceBuilder(IConfiguration config, WebHostEnvironment environment)
{
context.Configuration = config;
context.HostingEnvironment = new EnvironmentWrapper(environment);
}
public void Build(IServiceCollection serviceCollection)
{
foreach (var configurationDelegate in configureSiloDelegates)
{
configurationDelegate(context, this);
}
serviceCollection.AddHostedService<SiloHost>();
this.ConfigureDefaults();
this.ConfigureApplicationParts(parts => parts.ConfigureDefaults());
foreach (var configurationDelegate in configureServicesDelegates)
{
configurationDelegate(context, serviceCollection);
}
}
public ISiloBuilder ConfigureSilo(Action<HostingBuilderContext, ISiloBuilder> configureDelegate)
{
Guard.NotNull(configureDelegate, nameof(configureDelegate));
configureSiloDelegates.Add(configureDelegate);
return this;
}
public ISiloBuilder ConfigureServices(Action<HostingBuilderContext, IServiceCollection> configureDelegate)
{
Guard.NotNull(configureDelegate, nameof(configureDelegate));
configureServicesDelegates.Add(configureDelegate);
return this;
}
}
}
Loading…
Cancel
Save