Skip to content

Commit

Permalink
JobScheduler MultiTenant | appropriate Object Space to the Additionalโ€ฆ
Browse files Browse the repository at this point in the history
โ€ฆObjectSpaces

#1065
  • Loading branch information
apobekiaris committed Aug 20, 2024
1 parent 3980d74 commit e3a62e4
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
๏ปฟusing System;
using System.Linq;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.MultiTenancy;
using DevExpress.ExpressApp.Updating;
using Fasterflect;
using Hangfire;
using Xpand.Extensions.XAF.ObjectSpaceExtensions;
using Xpand.Extensions.XAF.XafApplicationExtensions;
using Xpand.XAF.Modules.JobScheduler.Hangfire.BusinessObjects;

namespace Xpand.XAF.Modules.JobScheduler.Hangfire {
public class CronExpressionModuleUpdater:ModuleUpdater {
public CronExpressionModuleUpdater(IObjectSpace objectSpace, Version currentDBVersion) : base(objectSpace, currentDBVersion) {
}

public class CronExpressionModuleUpdater(IObjectSpace objectSpace, Version currentDBVersion, XafApplication application)
: ModuleUpdater(objectSpace, currentDBVersion) {
public override void UpdateDatabaseAfterUpdateSchema() {
base.UpdateDatabaseAfterUpdateSchema();
if (application.GetService<ITenantProvider>()!=null&&ObjectSpace.TenantName()==null)return;
if (!ObjectSpace.Any<CronExpression>()) {
var expressions = new[]{nameof(Cron.Never),nameof(Cron.Minutely),nameof(Cron.Hourly),nameof(Cron.Daily),nameof(Cron.Monthly),nameof(Cron.Yearly)}
.Select(s => (name:s,value:$"{typeof(Cron).Method(s,Type.EmptyTypes,Flags.StaticPublic).Call(null)}"));
Expand Down
15 changes: 6 additions & 9 deletions src/Modules/JobScheduler.Hangfire/Hangfire/JobActivator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,18 @@
using Microsoft.Extensions.DependencyInjection;

namespace Xpand.XAF.Modules.JobScheduler.Hangfire.Hangfire {
public class ServiceJobActivatorScope : JobActivatorScope {
readonly IServiceScope _serviceScope;
public ServiceJobActivatorScope(IServiceScope serviceScope) => _serviceScope = serviceScope;

public class ServiceJobActivatorScope(IServiceScope serviceScope) : JobActivatorScope {
public override void DisposeScope() {
base.DisposeScope();
_serviceScope.Dispose();
serviceScope.Dispose();
}

public override object Resolve(Type type) => ActivatorUtilities.GetServiceOrCreateInstance(_serviceScope.ServiceProvider, type);
public override object Resolve(Type type) => ActivatorUtilities.GetServiceOrCreateInstance(serviceScope.ServiceProvider, type);
}

public class ServiceJobActivator : AspNetCoreJobActivator {
readonly IServiceScopeFactory _serviceScopeFactory;
public ServiceJobActivator(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory) => _serviceScopeFactory = serviceScopeFactory ;
public class ServiceJobActivator(IServiceScopeFactory serviceScopeFactory)
: AspNetCoreJobActivator(serviceScopeFactory) {
readonly IServiceScopeFactory _serviceScopeFactory = serviceScopeFactory;

public override JobActivatorScope BeginScope(JobActivatorContext context) => new ServiceJobActivatorScope(_serviceScopeFactory.CreateScope());

Expand Down
9 changes: 5 additions & 4 deletions src/Modules/JobScheduler.Hangfire/JobSchedulerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,11 @@ internal static IObservable<TSource> TraceJobSchedulerModule<TSource>(this IObse
internal static IEnumerable<MethodInfo> JobMethods(this AppDomain appDomain)
=> appDomain.GetAssemblies().FromModelSources().SelectMany(assembly => assembly.JobMethods());

public static IEnumerable<Assembly> FromModelSources(this IEnumerable<Assembly> assemblies)
=> assemblies.Where(assembly =>
CaptionHelper.ApplicationModel.ToReactiveModule<IModelReactiveModulesJobScheduler>().JobScheduler
.Sources.Select(source => source.AssemblyName).Contains(assembly.GetName().Name));
public static IEnumerable<Assembly> FromModelSources(this IEnumerable<Assembly> assemblies) {
var names = CaptionHelper.ApplicationModel.ToReactiveModule<IModelReactiveModulesJobScheduler>().JobScheduler
.Sources.Select(source => source.AssemblyName).ToArray();
return assemblies.Where(assembly => names.Contains(assembly.GetName().Name));
}

public static IEnumerable<MethodInfo> JobMethods(this Assembly assembly)
=> assembly.GetTypes()
Expand Down
2 changes: 1 addition & 1 deletion src/Modules/JobScheduler.Hangfire/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public override void Setup(ApplicationModulesManager moduleManager){
}

public override IEnumerable<ModuleUpdater> GetModuleUpdaters(IObjectSpace objectSpace, Version versionFromDB)
=> base.GetModuleUpdaters(objectSpace, versionFromDB).Concat(new []{new CronExpressionModuleUpdater(objectSpace, versionFromDB) });
=> base.GetModuleUpdaters(objectSpace, versionFromDB).Concat(new []{new CronExpressionModuleUpdater(objectSpace, versionFromDB,Application) });

public override void ExtendModelInterfaces(ModelInterfaceExtenders extenders){
base.ExtendModelInterfaces(extenders);
Expand Down

0 comments on commit e3a62e4

Please sign in to comment.