我正在研究nopCommerce v3.90。我对一个插件有一个要求,该插件将根据插件设置部分中执行的设置以某种百分比比率更新产品的原始价格,而不会更改现有的nopCommerce模型结构。
因此,每次显示产品价格时,都应该能够看到新更新的价格(基于插件中执行的操作),而不是数据库中的价格。
谁能帮我解决这个问题?
nopCommerce 中的现有模型类
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
}
在3.9中,我知道的选项是
- 重写类
IProductModelFactory
PrepareProductPriceModel
方法,并使用依赖项重写提供自定义实现 - 实现一个
ActionFilter
,以便在视图中使用ProductPriceModel
之前对其进行自定义。
在4.0中,这很容易。您只需要订阅ModelPreparedEvent
,然后自定义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) };
}
}
在您的插件依赖项注册器中
builder.RegisterType<PriceInterceptorFilterProvider>()
.As<IFilterProvider>();
订阅ModelPreparedEvent<ProductDetailsModel>
(nopCommerce 4.0)
public class PriceInterceptor : IConsumer<ModelPreparedEvent<ProductDetailsModel>>
{
public void HandleEvent(ModelPreparedEvent<ProductDetailsModel> eventMessage)
{
// your own logic to prepare price model
}
}