使用nopCommerce

时间:2018-03-28 05:40:02

标签: plugins properties onchange nopcommerce nopcommerce-3.90

我正在研究nopCommerce v3.90。我需要一个插件,它会根据插件设置部分中执行的设置以某个百分比更新产品的原始价格,而不会改变现有的nopCommerce模型结构。

因此,每次显示产品价格时,应该能够看到新的更新价格(基于插件中执行的操作)而不是数据库中的价格。

任何人都可以帮我吗?

nopCommerce中的现有Model类

public partial class ProductPriceModel : BaseNopModel
{
    //block of statements

    public string Price { get; set; } //the property whose value need to be changed from plugin

    //block of statements
}

1 个答案:

答案 0 :(得分:2)

3.9 中我知道的选项是

  • 覆盖PrepareProductPriceModel类中的IProductModelFactory方法,并使用依赖性覆盖提供自定义实现
  • 在视图中使用ActionFilter之前,实施ProductPriceModel以自定义ModelPreparedEvent

4.0 中,这非常简单。您只需订阅ProductPriceModel,然后自定义IProductModelFactory

覆盖 public class CustomProductModelFactory : ProductModelFactory { // ctor .... protected override ProductDetailsModel.ProductPriceModel PrepareProductPriceModel(Product product) { // your own logic to prepare price model } }

builder.RegisterType<CustomProductModelFactory>()
       .As<IProductModelFactory>()
       .WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"))
       .InstancePerLifetimeScope();

在您的插件依赖注册商

ActionFilter

实施 public class PriceInterceptor : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext == null) throw new ArgumentNullException(nameof(filterContext)); if (filterContext.HttpContext?.Request == null) return; if (filterContext.Controller is Controller controller) { if (controller.ViewData.Model is ProductDetailsModel model) { // your own logic to prepare price model } } } }

public class PriceInterceptorFilterProvider : IFilterProvider
{
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        return new[] { new Filter(new PriceInterceptor(), FilterScope.Action, null) };
    }
}

动态提供你的ActionFilter

builder.RegisterType<PriceInterceptorFilterProvider>()
       .As<IFilterProvider>();

在您的插件依赖注册商

ModelPreparedEvent<ProductDetailsModel>

订阅 public class PriceInterceptor : IConsumer<ModelPreparedEvent<ProductDetailsModel>> { public void HandleEvent(ModelPreparedEvent<ProductDetailsModel> eventMessage) { // your own logic to prepare price model } } (nopCommerce 4.0)

{{1}}