我正在研究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
}
答案 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}}