2

ApiControllerプロジェクトのカスタム ベースを作成しました。

public abstract class MyApiControllerBase : ApiController
{
    private IContextService<DomainUnitOfWork> ContextService;

    private UnitOfWorkScopeBase<DomainUnitOfWork> _unitOfWorkScope;

    private bool _autoDispose;

    public bool DisposeUnitOfWorkOnResultExecuted
    {
        get { return this._autoDispose; }
        set { this._autoDispose = value; }
    }

    protected DomainUnitOfWork UnitOfWork
    {
        get { return UnitOfWorkScope.Current; }
    }

    private UnitOfWorkScopeBase<DomainUnitOfWork> UnitOfWorkScope
    {
        get
        {
            if (this._unitOfWorkScope == null)
            {
                this._unitOfWorkScope = new PerRequestUnitOfWorkScope<DomainUnitOfWork>(this.LightSpeedContext);
            }

            return this._unitOfWorkScope;
        }
    }

    private void DisposeUnitOfWorkScope()
    {
        if (this._autoDispose && this._unitOfWorkScope != null && this._unitOfWorkScope.HasCurrent)
        {
            DomainUnitOfWork current = this._unitOfWorkScope.Current;
            current.Dispose();
        }
    }

    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
    {
        return base.ExecuteAsync(controllerContext, cancellationToken)
            .ContinueWith<HttpResponseMessage>(ant =>
            {
                DisposeUnitOfWorkScope();
                return ant.Result;
            });
    }

    public MyApiControllerBase(IContextService<DomainUnitOfWork> contextService)
    {
        ContextService = contextService;
        this._autoDispose = true;
    }

    ~MyApiControllerBase()
    {
        Dispose(false);
    }

    public new void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            DisposeUnitOfWorkScope();
            ContextService = null;
        }

        base.Dispose(disposing);
    }

    protected LightSpeedContext<DomainUnitOfWork> LightSpeedContext
    {
        get { return ContextService.Context; }
    }
}

次に、 MyApiControllerBase から派生するコントローラーを作成しました。

public class MyApiController : MyApiControllerBase
{      
    (...)
    [ApiExplorerSettings(IgnoreApi = false)]
    public IEnumerable<MyDto> Get()
    {
         (...)
    }

    [ApiExplorerSettings(IgnoreApi = false)]
    public IEnumerable<MyDto> Get(int pageSize)
    {
        (...)
    }

    [ApiExplorerSettings(IgnoreApi = false)]
    public IEnumerable<MyDto> Get(int pageIdx, int pageSize)
    {
         (...)
    }

    [ApiExplorerSettings(IgnoreApi = false)]
    public IEnumerable<MyDto> Get(string id)
    {
         (...)
    }

    [ApiExplorerSettings(IgnoreApi = false)]
    public IEnumerable<MyDto> Get(string id, int pageSize)
    {
         (...) 
    }

    [ApiExplorerSettings(IgnoreApi = false)]
    public IEnumerable<MyDto> Get(string id, int pageIdx, int pageSize)
    {
         (...)
    }

    [ApiExplorerSettings(IgnoreApi = false)]
    public HttpResponseMessage Post(MyDto dto)
    {
        (...)
    }        

    public MyApiController(
        IContextService<DomainUnitOfWork> contextService)
        : base(contextService)
    {
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            (...)
        }

        base.Dispose(disposing);
    }
}

ことは次のとおりです。

APIヘルプページを追加しました。Controller が から派生するときはいつでも、MyApiControllerBasePOST メソッドは表示されません。から派生するときはいつでもApiController、すべて問題ありません。また、派生するときに、MyApiControllerBase実際に何も投稿できませんでした。

誰でもこの動作を説明できますか? 私は何を間違っていますか?

依存関係の解決に Ninject を使用し、ORM として LightSpeed を使用していることに注意してください。

* http://forums.asp.net/t/1855019.aspx/1?Problems+using+custom+ApiControllersからの転載

4

1 に答える 1