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:
Renaud Paquay
2010-06-14 09:01:31 -07:00
parent ad54ffdbb2
commit cd3a537396
22 changed files with 605 additions and 344 deletions

View File

@@ -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();
}