2016-09-20 6 views
0

私の無知を許しますが、現時点では、例外をキャッチして例外に基づいてクライアントにメッセージを表示する最善の方法を理解するのに苦労していますタイプ。例外処理戦略 - リポジトリから例外をキャッチしてWebApiコントローラに渡す

マイアーキテクチャ:あなたはそれだけでDBからデータを取得し、いくつかのシナリオでは、私が原因物理的にデータなしにobject not set to an instance of an object exceptionを得ることができる見ることができるように上記で

リポジトリ

Page IPageRepository.FindDefault() 
{ 
    try 
    { 
     return MapPageFromCategory.MapFromEntity(_context.tbl_Category. 
          FirstOrDefault(p => 
               p.IsLandingPage == true 
              ) 
        ); 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Error getting values from database :", ex); 
    } 
} 

テーブルにはNull exceptionが入ります。

両方のシナリオで、私のコントローラに渡す404例外を生成したいと思います。

public class PageController : ApiController 
{ 
    private IPageRepository _pageRepository; 
    public PageController(IPageRepository pageRepository) 
    { 
     this._pageRepository = pageRepository; 
    } 
    // GET 
    [HttpGet] 
    [Route("")] 
    public Page Get() 
    { 
     return this._pageRepository.FindDefault(); 
    } 
} 

私のコントローラがヒット

コントローラは、この方法だと、これらの例外のいずれかがヒットした場合、何がこれらの例外をインターセプトし、エンドクライアント(アプリを呼び出す)に渡すための最良のアプローチでしょうか?

もう一度、例外処理に対する体系的なアプローチを作成しようとしています。

ありがとうございました!

+1

Eric Lippertの[Vexing Exceptions](https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/)を読んだことがあります。これは、最良のアプローチを策定するのに役立ちます。 – Enigmativity

+0

'_context'は' DbContext'型ですか?はいの場合は、それぞれの 'Repository'メソッドでコンテキストを作成することをお勧めします。なぜなら、複数のスレッドが同じ '_context'を使用しようとすると、あなたは奇妙な状況に陥るかもしれないからです。 – Gabrielius

+0

@Gabrieliusはい、それはDbContextから派生した私のエンティティコンテキストです。私の基本クラス(Generic EntityRepository)はコンテキストをインスタンス化し、派生クラス(PageRepository)ではベースからフェッチしてCtorに渡し、IoCを使用してそのリポジトリの新しいインスタンスを作成します。 –

答えて

0

Controllerクラスに別のtry/catchを用意し、そのリポジトリからスローされた例外を処理するか、または別の処理を行うことができます。

あなたはこれに似たクラスを作成することができます。

public class Result 
{ 
    public bool Succeded { get; private set; } 

    protected Result(bool succeeded) 
    { 
     Succeded = succeeded; 
    } 
} 

public class Result<TData> : Result 
{ 
    public TData Data { get; private set; } 

    protected Result(bool succeeded, TData data) : base(succeeded) 
    { 
     Data = data; 
    } 
}  

その後、あなたはあなたのリポジトリから、これを返し、呼び出しが成功した場合、コントローラに確認することができます。そうでない場合は、必要な例外をスローします。これにより、StatusCodeが適宜設定されます。

+0

私は同様のプロセスを使用しました。コメントの1つのリンクは、私が最良のアプローチを特定するのに役立ちました。御時間ありがとうございます。 –

関連する問題