mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
work on extension loading
* Add a "ExtensionLoaderCoordinator" class * Rework the way loaders are notified of extensions being loaded, (de)activated, etc. --HG-- branch : dev
This commit is contained in:
@@ -23,6 +23,7 @@ namespace Orchard.Environment {
|
||||
private readonly IRunningShellTable _runningShellTable;
|
||||
private readonly IProcessingEngine _processingEngine;
|
||||
private readonly IExtensionManager _extensionManager;
|
||||
private readonly IExtensionLoaderCoordinator _extensionLoaderCoordinator;
|
||||
private readonly ICacheManager _cacheManager;
|
||||
|
||||
private IEnumerable<ShellContext> _current;
|
||||
@@ -33,6 +34,7 @@ namespace Orchard.Environment {
|
||||
IRunningShellTable runningShellTable,
|
||||
IProcessingEngine processingEngine,
|
||||
IExtensionManager extensionManager,
|
||||
IExtensionLoaderCoordinator extensionLoaderCoordinator,
|
||||
ICacheManager cacheManager,
|
||||
ControllerBuilder controllerBuilder) {
|
||||
_shellSettingsManager = shellSettingsManager;
|
||||
@@ -40,6 +42,7 @@ namespace Orchard.Environment {
|
||||
_runningShellTable = runningShellTable;
|
||||
_processingEngine = processingEngine;
|
||||
_extensionManager = extensionManager;
|
||||
_extensionLoaderCoordinator = extensionLoaderCoordinator;
|
||||
_cacheManager = cacheManager;
|
||||
_controllerBuilder = controllerBuilder;
|
||||
Logger = NullLogger.Instance;
|
||||
@@ -78,9 +81,16 @@ namespace Orchard.Environment {
|
||||
}
|
||||
|
||||
IEnumerable<ShellContext> BuildCurrent() {
|
||||
lock (this) {
|
||||
return _current ?? (_current = CreateAndActivate().ToArray());
|
||||
if (_current == null) {
|
||||
lock (this) {
|
||||
if (_current == null) {
|
||||
SetupExtensions();
|
||||
MonitorExtensions();
|
||||
_current = CreateAndActivate().ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
return _current;
|
||||
}
|
||||
|
||||
IEnumerable<ShellContext> CreateAndActivate() {
|
||||
@@ -119,13 +129,21 @@ namespace Orchard.Environment {
|
||||
return _shellContextFactory.CreateShellContext(settings);
|
||||
}
|
||||
|
||||
protected virtual void BeginRequest() {
|
||||
private void SetupExtensions() {
|
||||
_extensionLoaderCoordinator.SetupExtensions();
|
||||
}
|
||||
|
||||
private void MonitorExtensions() {
|
||||
_cacheManager.Get("OrchardHost_Extensions",
|
||||
ctx => {
|
||||
_extensionManager.Monitor(ctx.Monitor);
|
||||
_current = null;
|
||||
return "";
|
||||
});
|
||||
ctx => {
|
||||
_extensionLoaderCoordinator.MonitorExtensions(ctx.Monitor);
|
||||
_current = null;
|
||||
return "";
|
||||
});
|
||||
}
|
||||
|
||||
protected virtual void BeginRequest() {
|
||||
MonitorExtensions();
|
||||
BuildCurrent();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user