さまざまなデータ クエリ用の Web API エンドポイントを持つ MVC ソリューションを実装しています。この投稿で説明されている手法を使用して、検証の問題をサービス層に分離しています。
特定の質問にスキップしたい場合は、この投稿の最後にTL;DRがあります。
これが私のApiController
コードです:
[Authorize]
public class FriendsController : ApiController
{
private IItemService _service;
public FriendsController()
{
_service = new ItemService(new HttpModelStateWrapper(ModelState), new ViewModelRepository());
}
public FriendsController(IItemService service)
{
_service = service;
}
// GET api/friends
public IEnumerable<User> Get()
{
return _service.GetFriends(User.Identity.Name);
}
.
.
.
// POST api/friends
public void Post(Guid id)
{
var user = _service.AddFriend(User.Identity.Name, id); // Handles error and should update ViewModel
NotificationAsyncController.AddNotification(user);
}
}
コードは_service.AddFriend(User.Identity.Name, id);
次のようになります。
public User AddFriend(string userName, Guid id)
{
try
{
return _repository.AddFriend(userName, id);
}
catch (Exception e)
{
_validationDictionary.AddError("AddFriend", e.Message);
return null;
}
}
次_validationDictionary
のようになります。
public class HttpModelStateWrapper : IValidationDictionary
{
private ModelStateDictionary ModelState;
public HttpModelStateWrapper(ModelStateDictionary ModelState)
{
this.ModelState = ModelState;
}
public void AddError(string key, string errorMessage)
{
if (ModelState != null)
ModelState.AddModelError(key, errorMessage);
}
public bool IsValid
{
get { return ModelState == null ? false : ModelState.IsValid; }
}
}
_repository.AddFriend(userName, id);
がエラーをスローして_validationDictionary.AddError("AddFriend", e.Message);
呼び出された場合、 にある ModelState オブジェクトは、 にある ModelState オブジェクトを_validationDictionary
更新しないことがわかりましたFriendsController
。
つまり、AddError
が呼び出された後、 の ModelState はHttpModelStateWrapper
有効ではありませんが、そのメソッドが返され、スコープが に返されるとFriendsController
、その ModelState は更新されておらず、まだ有効です!
TL;DR
HttpModelStateWrapper
のctor に渡した ModelState オブジェクトを取得するにはどうすればよいですか?FriendsController
その変更が の ModelState オブジェクトに反映されFriendsController
ますか?