在3.9中,我知道的选项是
- 覆盖类
PrepareProductPriceModel
中的方法IProductModelFactory
并使用依赖项覆盖提供您的自定义实现
- 在视图中使用它之前实现一个
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
}
}
}
}
并动态提供您的 ActionFilter
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
}
}