Browse Source

WebHost compatibility pack.

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