2011-05-02 141 views
0

首先处理我会解释我的项目的结构:异常与企业库5.0

我有一个WCF服务

public class MyService : IMyService 
{ 
    private QueryHandler _queryHandler; 

    public MyService() 
    { 
     _queryHandler = new QueryHandler(); 
    } 

    public MyObject GetMyObject(string param1, string param2) 
    { 
     return _queryHandler.GetMyObject(param1, param2); 
    } 
} 

的QueryHandler级是在不同的项目,是地方我在哪里查询我的数据库。

我有点困惑哪种方法有关异常处理应用程序块采取: 不要我把一个try ... catch围绕在queryhandler每一个数据访问代码并执行异常处理,如:

try 
{ 
    //Do something 
} 
catch (Exception ex) 
{ 
    ExceptionManager exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); 
    Exception exceptionToThrow; 
    bool rethrow = exManager.HandleException(ex, "Exceptions Policy", out exceptionToThrow); 

    if (rethrow) 
    { 
     if (exceptionToThrow == null) 
     { 
      throw; 
     } 
     else 
     { 
      throw exceptionToThrow; 
     } 
    } 
    return null; 
} 

还是我把它放在我的web服务类,如:

public MyObject GetMyObject(string param1, string param2) 
    { 
     var exceptionManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); 
     return exceptionManager.Process(() => _queryHandler.GetMyObject(param1, param2), "Exceptions Policy"); 
    } 

回答

2

既然你提到WCF,您可以使用内置的[ExceptionShielding]属性来处理你的服务你的例外。

你最终会像这样的东西:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    [FaultContract(typeof(FaultContracts.GetMyObjectFault))] 
    MyObject GetMyObject(string param1, string param2); 
} 

[ExceptionShielding("GetMyObjectServicePolicy")] 
public class MyService : IMyService 
{ 
    private QueryHandler _queryHandler; 

    public MyService() 
    { 
     _queryHandler = new QueryHandler(); 
    } 

    public MyObject GetMyObject(string param1, string param2) 
    { 
     return _queryHandler.GetMyObject(param1, param2); 
    } 
} 
+0

这将是我下一步;-)但是,如果我理解正确,使用ExceptionShielding的时候,我不需要使用任何尝试...再抓?还是我仍然必须把它们放在我的QueryHandler类中? – Koen 2011-05-02 12:59:27

+1

使用该属性时,您不必担心代码中的任何“try {} catch {}”块,因为屏蔽策略应为您处理这些问题。如果你可以从异常中恢复,你可能仍然需要在'QueryHandler'中尝试{} catch {}'块,但是如果所有的策略都是'rethrow',我将把处理保留为屏蔽属性。 – 2011-05-02 13:17:52

+0

非常感谢。仍然需要做一些关于屏蔽的阅读,但这是一个很大的帮助。 – Koen 2011-05-02 14:10:42