1

我想知道,创建标记虚拟类(内部没有成员)是否仅用于通用签名是一个好主意。

例如,考虑下面的接口签名:

public interface IBusinessValidatorFor<TContext, TEntity>
    where TContext : IContext
{
    IList<ValidationStatus> Validate (TEntity entityToValidate);
}

实现上述接口的示例具体类可以是:

public sealed class BusinessValidatorFor<CreationContext, Customer>
    : IBusinessValidatorFor<CreationContext, Customer>
{
    public IList<ValidationStatus> Validate (Customer customerToValidate)
    {
        // Creation of customer related business validation code here.
    }
}

在上面的具体类定义中,CreationContext类(它实现了标记接口IContext)是一个没有属性的虚拟类,但仅用于将其与同一 Customer 类的其他验证器区分开来,但用于不同的其他上下文。

这种方法是个好主意吗?有没有比使用虚拟无成员空类更好的设计替代方案?

上述设计的目的是允许为同一个实体创建多个验证器具体类,但针对不同的上下文,并将其与依赖注入容器一起使用。

以下代码显示了此类验证器在各种上下文中的用法:

public sealed class CustomerController
    : Controller
{
    private readonly IBusinessValidatorFor<CreationContext, Customer>
        custCreateValidator;

    private readonly IBusinessValidatorFor<ModificationContext, Customer>
        custModifyValidator;

    public CustomerController
        (
            IBusinessValidatorFor<CreationContext, Customer> custCreateValidator,
            IBusinessValidatorFor<ModificationContext, Customer> custModifyValidator,
        )
    {
        this.custCreateValidator = custCreateValidator;
        this.custModifyValidator= custModifyValidator;
    }

    public ActionResult Create (Customer customerToCreate)
    {
        var results = this.custCreateValidator.Validate (customerToCreate);
        ...
    }

    public ActionResult Modify (Customer customerToModify)
    {
        var results = this.custModifyValidator.Validate (customerToModify);
        ...
    }
}

非常感谢您的时间和帮助!

4

0 回答 0