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