Extend Product Completeness Evaluation Process¶
The Catalog Publishing Module allows to evaluate the completeness of products for publication according to specified criteria.
In this guide, we will show how to extend the product completeness evaluation process to allow full customization. Below are potential user scenarios along with solutions.
Add New Detail to Default Evaluation Process¶
To integrate additional details into the default evaluation process:
- Inherit your detail evaluator from
DefaultCompletenessDetailEvaluator
class. -
Override
EvaluateCompleteness
method: -
Register this class as implementation of
DefaultCompletenessDetailEvaluator
in Unity:
The default product completeness evaluator includes your detail evaluator in evaluation process.
Define Own Product Completeness Evaluator¶
To create your own product completeness evaluator, you can:
After that, register your class as implementation of ICompletenessEvaluator
in Unity:
_container.RegisterType<ICompletenessEvaluator, CustomCompletenessEvaluator>(nameof(CustomCompletenessEvaluator));
Now your product completeness evaluator is available in module's REST API and UI.
Define Own Product Completeness Evaluator¶
If you want to define your own product completeness evaluation process, you can implement the same extensibility logic as ours:
public class CustomCompletenessEvaluator : ICompletenessEvaluator
{
protected IReadOnlyCollection<ICompletenessDetailEvaluator> DetailEvaluators { get; }
public CustomCompletenessEvaluator(CustomCompletenessDetailEvaluator[] detailEvaluators, IItemService productService) :
this(detailEvaluators as ICompletenessDetailEvaluator[], productService)
{
}
protected CustomCompletenessEvaluator(ICompletenessDetailEvaluator[] detailEvaluators, IItemService productService)
{
_productService = productService;
DetailEvaluators = detailEvaluators;
}
public virtual CompletenessEntry[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
{
}
}
If you prefer not to define your own product completeness evaluation process from scratch, you can simply customize the default process provided by inheriting from the DefaultCompletenessEvaluator. Here are the options for customizing your product completeness evaluator:
- Default detail evaluators: Use the default detail evaluators provided.
- Custom detail evaluators: Implement your own custom detail evaluators.
- Combining default and custom detail evaluators: Mix default and custom detail evaluators to suit your needs.
- Mixing default and all custom detail evaluators: Utilize some default evaluators alongside entirely custom ones.
Default Detail Evaluators¶
To use the default detail evaluators provided:
- Inject
DefaultCompletenessDetailEvaluator
array to your constructor. - Pass it to the protected constructor of the
DefaultCompletenessEvaluator
base class:public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator { private readonly IItemService _productService; public CustomCompletenessEvaluator(DefaultCompletenessDetailEvaluator[] detailEvaluators, IItemService productService) : base(detailEvaluators as ICompletenessDetailEvaluator[], productService) { } }
Custom Detail Evaluators¶
To implement your own custom detail evaluators:
- Create your own (possible, abstract) base class for detail evaluators.
- Inherit all your detail evaluators from it:
public abstract class CustomCompletenessDetailEvaluator : ICompletenessDetailEvaluator { public abstract CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products); } public class CustomCompletenessDetailEvaluator1 : CustomCompletenessDetailEvaluator { public override CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products) { } } public class CustomCompletenessDetailEvaluator2 : CustomCompletenessDetailEvaluator { public override CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products) { } }
-
Inject
CustomCompletenessDetailEvaluator
array into the constructor of your product completeness evaluator and pass this array to the protected constructor of theDefaultCompletenessEvaluator
base class:public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator { private readonly IItemService _productService; public CustomCompletenessEvaluator(CustomCompletenessDetailEvaluator[] detailEvaluators, IItemService productService) : base(detailEvaluators as ICompletenessDetailEvaluator[], productService) { } }
-
Register your detail evaluators as implementation of
CustomCompletenessEvaluator
class in Unity:
Combine Default and Custom Detail Evaluators¶
To combine both default and custom detail evaluators:
- Inject both
DefaultCompletenessDetailEvaluator
andCustomCompletenessDetailEvaluator
arrays (see code above). Then concatenate them. -
Pass this array to the protected constructor of the
DefaultCompletenessEvaluator
base class:public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator { private readonly IItemService _productService; public CustomCompletenessEvaluator(DefaultCompletenessDetailEvaluator[] defaultDetailEvaluators, CustomCompletenessDetailEvaluator[] customDetailEvaluators, IItemService productService) : base(defaultDetailEvaluators.Concat<ICompletenessDetailEvaluator>(customDetailEvaluators).ToArray(), productService) { } }
Mix Default and All Custom Detail Evaluators¶
To mix default and all custom detail evaluators:
- Create an array of instances of default detail evaluators.
- Inject
CustomCompletenessDetailEvaluator
arrays (see code above). Then concatenate them. -
Pass this array to the protected constructor of the
DefaultCompletenessEvaluator
base class:public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator { private readonly IItemService _productService; private readonly IPricingSearchService _pricingSearchService; public CustomCompletenessEvaluator(CustomCompletenessDetailEvaluator[] detailEvaluators, IItemService productService, IPricingSearchService pricingSearchService) : base(new[] { new PropertiesCompletenessDetailEvaluator(), new PricesCompletenessDetailEvaluator(pricingSearchService) }.Concat<ICompletenessDetailEvaluator>(customDetailEvaluators).ToArray(), productService) { } }