Factoring out Alias updating logic to separate service so aliases can be refreshed not just from a background task.

This commit is contained in:
Lombiq
2014-09-10 17:37:57 +02:00
committed by Zoltán Lehóczky
parent 8818202fcf
commit a3053c3d9a
4 changed files with 77 additions and 52 deletions

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Orchard.Alias.Implementation.Holder;
using Orchard.Alias.Implementation.Storage;
namespace Orchard.Alias.Implementation.Updater {
public interface IAliasHolderUpdater : IDependency {
void Refresh();
}
public class AliasHolderUpdater : IAliasHolderUpdater {
private readonly IAliasHolder _aliasHolder;
private readonly IAliasStorage _storage;
private readonly IAliasUpdateCursor _cursor;
public AliasHolderUpdater(IAliasHolder aliasHolder, IAliasStorage storage, IAliasUpdateCursor cursor) {
_aliasHolder = aliasHolder;
_storage = storage;
_cursor = cursor;
}
public void Refresh() {
// only retreive aliases which have not been processed yet
var aliases = _storage.List(x => x.Id > _cursor.Cursor).ToArray();
// update the last processed id
if (aliases.Any()) {
_cursor.Cursor = aliases.Last().Item5;
_aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3 }));
}
}
}
}

View File

@@ -0,0 +1,40 @@
using System;
using System.Linq;
using Orchard.Alias.Implementation.Holder;
using Orchard.Alias.Implementation.Storage;
using Orchard.Environment;
using Orchard.Tasks;
using Orchard.Logging;
namespace Orchard.Alias.Implementation.Updater {
public class AliasHolderUpdaterTask : IOrchardShellEvents, IBackgroundTask {
private readonly IAliasHolderUpdater _aliasHolderUpdater;
public ILogger Logger { get; set; }
public AliasHolderUpdaterTask(IAliasHolderUpdater aliasHolderUpdater) {
_aliasHolderUpdater = aliasHolderUpdater;
Logger = NullLogger.Instance;
}
void IOrchardShellEvents.Activated() {
Refresh();
}
void IOrchardShellEvents.Terminating() {
}
private void Refresh() {
try {
_aliasHolderUpdater.Refresh();
}
catch (Exception ex) {
Logger.Error(ex, "Exception during Alias refresh");
}
}
public void Sweep() {
Refresh();
}
}
}

View File

@@ -1,51 +0,0 @@
using System;
using System.Linq;
using Orchard.Alias.Implementation.Holder;
using Orchard.Alias.Implementation.Storage;
using Orchard.Environment;
using Orchard.Tasks;
using Orchard.Logging;
namespace Orchard.Alias.Implementation.Updater {
public class AliasHolderUpdater : IOrchardShellEvents, IBackgroundTask {
private readonly IAliasHolder _aliasHolder;
private readonly IAliasStorage _storage;
private readonly IAliasUpdateCursor _cursor;
public ILogger Logger { get; set; }
public AliasHolderUpdater(IAliasHolder aliasHolder, IAliasStorage storage, IAliasUpdateCursor cursor) {
_aliasHolder = aliasHolder;
_storage = storage;
_cursor = cursor;
Logger = NullLogger.Instance;
}
void IOrchardShellEvents.Activated() {
Refresh();
}
void IOrchardShellEvents.Terminating() {
}
private void Refresh() {
try {
// only retreive aliases which have not been processed yet
var aliases = _storage.List(x => x.Id > _cursor.Cursor).ToArray();
// update the last processed id
if (aliases.Any()) {
_cursor.Cursor = aliases.Last().Item5;
_aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3 }));
}
}
catch (Exception ex) {
Logger.Error(ex, "Exception during Alias refresh");
}
}
public void Sweep() {
Refresh();
}
}
}

View File

@@ -76,6 +76,7 @@
<Content Include="Views\Admin\Edit.cshtml" />
<Content Include="Views\Admin\Index.cshtml" />
<Content Include="Web.config" />
<Compile Include="Implementation\Updater\AliasHolderUpdater.cs" />
<Compile Include="Implementation\Updater\AliasUpdateCursor.cs" />
<Compile Include="Implementation\Updater\IAliasUpdateCursor.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -102,7 +103,7 @@
<Compile Include="Implementation\Holder\IAliasHolder.cs" />
<Compile Include="Implementation\Map\AliasMap.cs" />
<Compile Include="Implementation\Storage\AliasStorage.cs" />
<Compile Include="Implementation\Updater\AliasUpdater.cs" />
<Compile Include="Implementation\Updater\AliasHolderUpdaterTask.cs" />
<Compile Include="Implementation\Utils.cs" />
<Compile Include="Migrations.cs" />
<Compile Include="Records\ActionRecord.cs" />