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 が から派生するときはいつでも、MyApiControllerBase
POST メソッドは表示されません。から派生するときはいつでもApiController
、すべて問題ありません。また、派生するときに、MyApiControllerBase
実際に何も投稿できませんでした。
誰でもこの動作を説明できますか? 私は何を間違っていますか?
依存関係の解決に Ninject を使用し、ORM として LightSpeed を使用していることに注意してください。
* http://forums.asp.net/t/1855019.aspx/1?Problems+using+custom+ApiControllersからの転載