-2

オブジェクトのリストを返す(そしてそれらをDTOからビジネスにマップする)ベースコントローラーがあります

子コントローラーが仕様を適用することを決定した場合 (フィルターまたは何かを含める)、GetSpecification()メソッドをオーバーライドすることで実行できます。

しかし、デフォルトでは、基本クラスではオブジェクトをフィルタリングしたくありません。

[Route("api/[controller]")]
[ApiController]
public class BaseApiController<TBusinessModel, TApiModel, 
                               TBaseRepository> : BaseController<TBaseRepository>
                         where TBusinessModel   : BaseEntity
                         where TBaseRepository  : IBaseRepository
{
    public BaseApiController(TBaseRepository repository, 
                             IMapper mapper) : base(repository, mapper)
     { }

     // GET: api/Bars
     [HttpGet]
     public virtual async Task<IActionResult> List()
     {
        var spec = GetSpecification();
        var items = await _repository.ListAsync<TBusinessModel>(spec);
        var apiItems = _mapper.Map<List<TApiModel>>(items);                
        return Ok(apiItems);
     }

     protected virtual ISpecification<TBusinessModel> GetSpecification() 
     {
     // how to get an empty specification that does not filter or do something?
            return new Specification<TBusinessModel>(); 
      }
}

私はardalis仕様を使用していますが、それは一般的IQueryableなものである可能性があります...

実際には次のように述べています。

ここに画像の説明を入力

エラー CS0144 抽象型またはインターフェイス '仕様' のインスタンスを作成できません

4

3 に答える 3

0

最後に、空の指定のようなものは提供されたライブラリには存在しないので、私はそれを自分で作成しました:

public class EmptySpecification<T> : Specification<T>
{
    public EmptySpecification()
    {
        // does nothing
    }
}

次に BaseController (最後の行) で使用されます。

[Route("api/[controller]")]
[ApiController]
public class BaseApiController<TBusinessModel, TDto, TBaseRepository> : BaseController<TBusinessModel, TDto, TBaseRepository>
    where TBusinessModel : BaseEntity
    where TBaseRepository : IBaseRepository
{
    public BaseApiController(TBaseRepository repository, IMapper mapper) : base(repository, mapper) { }

    [HttpGet]
    public virtual async Task<IActionResult> List()
    {
        var spec = ListSpecification();
        var items = await _repository.ListAsync<TBusinessModel>(spec);
        var apiItems = ToDto(items);
        return Ok(apiItems);
    }

    protected virtual ISpecification<TBusinessModel> ListSpecification()
    {
        return new EmptySpecification<TBusinessModel>();
    }
}
于 2021-02-02T23:18:48.627 に答える