Skip to content

Commit 5f8492f

Browse files
committed
Plugin-specific event consumers do not run anymore if the plugin has been disabled for the current store
1 parent c6969aa commit 5f8492f

3 files changed

Lines changed: 43 additions & 4 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System;
2+
using SmartStore.Core.Plugins;
23

34
namespace SmartStore.Core.Events
45
{
56
public class EventConsumerMetadata
67
{
78
public bool ExecuteAsync { get; set; }
89
public bool IsActive { get; set; }
10+
public PluginDescriptor PluginDescriptor { get; set; }
911
}
1012
}

src/Libraries/SmartStore.Services/Events/DefaultConsumerFactory.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,22 @@
33
using System.Collections.Generic;
44
using SmartStore.Core.Infrastructure;
55
using SmartStore.Core.Events;
6+
using SmartStore.Core.Plugins;
67

78
namespace SmartStore.Services.Events
89
{
910

1011
public class DefaultConsumerFactory<T> : IConsumerFactory<T>
1112
{
1213
private readonly IEnumerable<Lazy<IConsumer<T>, EventConsumerMetadata>> _consumers;
14+
private readonly ICommonServices _services;
1315

14-
public DefaultConsumerFactory(IEnumerable<Lazy<IConsumer<T>, EventConsumerMetadata>> consumers)
16+
public DefaultConsumerFactory(
17+
IEnumerable<Lazy<IConsumer<T>, EventConsumerMetadata>> consumers,
18+
ICommonServices services)
1519
{
1620
this._consumers = consumers;
21+
this._services = services;
1722
}
1823

1924
public IEnumerable<IConsumer<T>> GetConsumers(bool? resolveAsyncs = null)
@@ -22,9 +27,14 @@ public IEnumerable<IConsumer<T>> GetConsumers(bool? resolveAsyncs = null)
2227
{
2328
var isActive = consumer.Metadata.IsActive;
2429
var isAsync = consumer.Metadata.ExecuteAsync;
30+
var pluginDescriptor = consumer.Metadata.PluginDescriptor;
31+
2532
if (isActive && (resolveAsyncs == null || (resolveAsyncs.Value == isAsync)))
2633
{
27-
yield return consumer.Value;
34+
if (pluginDescriptor == null || IsActiveForStore(pluginDescriptor, _services.StoreContext.CurrentStore.Id))
35+
{
36+
yield return consumer.Value;
37+
}
2838
}
2939
}
3040
}
@@ -37,6 +47,29 @@ public bool HasAsyncConsumer
3747
return _consumers.Any(c => c.Metadata.IsActive == true && c.Metadata.ExecuteAsync == true);
3848
}
3949
}
50+
51+
private bool IsActiveForStore(PluginDescriptor plugin, int storeId)
52+
{
53+
if (storeId == 0)
54+
{
55+
return true;
56+
}
57+
58+
var limitedToStoresSetting = _services.Settings.GetSettingByKey<string>(plugin.GetSettingKey("LimitedToStores"));
59+
if (limitedToStoresSetting.IsEmpty())
60+
{
61+
return true;
62+
}
63+
64+
var limitedToStores = limitedToStoresSetting.ToIntArray();
65+
if (limitedToStores.Length > 0)
66+
{
67+
var flag = limitedToStores.Contains(storeId);
68+
return flag;
69+
}
70+
71+
return true;
72+
}
4073
}
4174

4275
}

src/Presentation/SmartStore.Web.Framework/DependencyRegistrar.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, b
9090
builder.RegisterModule(new CachingModule());
9191
builder.RegisterModule(new LocalizationModule());
9292
builder.RegisterModule(new LoggingModule());
93-
builder.RegisterModule(new EventModule(typeFinder));
93+
builder.RegisterModule(new EventModule(typeFinder, pluginFinder));
9494
builder.RegisterModule(new MessagingModule());
9595
builder.RegisterModule(new WebModule(typeFinder));
9696
builder.RegisterModule(new WebApiModule(typeFinder));
@@ -493,10 +493,12 @@ protected override void Load(ContainerBuilder builder)
493493
public class EventModule : Module
494494
{
495495
private readonly ITypeFinder _typeFinder;
496+
private readonly IPluginFinder _pluginFinder;
496497

497-
public EventModule(ITypeFinder typeFinder)
498+
public EventModule(ITypeFinder typeFinder, IPluginFinder pluginFinder)
498499
{
499500
_typeFinder = typeFinder;
501+
_pluginFinder = pluginFinder;
500502
}
501503

502504
protected override void Load(ContainerBuilder builder)
@@ -512,12 +514,14 @@ protected override void Load(ContainerBuilder builder)
512514

513515
var registration = builder.RegisterType(consumerType).As(implementedInterfaces);
514516

517+
var pluginDescriptor = _pluginFinder.GetPluginDescriptorByAssembly(consumerType.Assembly);
515518
var isActive = PluginManager.IsActivePluginAssembly(consumerType.Assembly);
516519
var shouldExecuteAsync = consumerType.GetAttribute<AsyncConsumerAttribute>(false) != null;
517520

518521
registration.WithMetadata<EventConsumerMetadata>(m => {
519522
m.For(em => em.IsActive, isActive);
520523
m.For(em => em.ExecuteAsync, shouldExecuteAsync);
524+
m.For(em => em.PluginDescriptor, pluginDescriptor);
521525
});
522526

523527
if (!shouldExecuteAsync)

0 commit comments

Comments
 (0)