0

在我征服,試圖程序的功能更強大的方式,我想出了下面的靜態函數:確保給定輸入(純函數)的輸出相同?

public static class BaseService 
{ 
    public static T EntityGet<T>(Guid id, XrmServiceContext xrmServiceContext) where T : Entity 
    { 
     return xrmServiceContext.CreateQuery<T>().Single(query => query.Id == id); 
    } 
} 

我們如何才能確保它是確定的,總是返回相同的值在規定輸入?

請注意,XrmServiceContext是一個存儲庫,可能會根據連接是否打開或關閉而拋出。

我們是否應該將返回類型換成Maybe? :

public static Maybe<T> EntityGet<T>(Guid id, XrmServiceContext xrmServiceContext) where T : Entity 
{ 
    return xrmServiceContext.CreateQuery<T>().Single(query => query.Id == id).ToMaybe(); 
} 

這樣我們可以100%確定返回值。

問題:也許變化後,可我們現在已經完全確定性的行爲,無論倉庫是在向上或向下?

+0

單個將拋出一個異常,如果數據庫關閉,所以執行將不會達到ToMaybe。另外我不確定任何調用數據庫的函數(外部存儲)在嚴格意義上是否可以是純粹的。 – Evk

+0

我不知道。我們可以得出結論:你不能有一個純數據庫調用的函數嗎? –

回答

1

你可以把你的電話打個招呼,在最後,總是回覆一個也許,但我不確定這是我會推薦的一個行動方案。這意味着每個正在檢索實體的呼叫站點都必須處理檢查可能,然後決定如果失敗則應該怎麼做。

在這種情況下,而不是追求「完美」 enter image description here 我會接受錯誤發生,他們會泡。此外,由於您正在處理數據庫,因此不能保證該值將存在於數據庫中,或者它將保持相同的值(未更新)。

+0

hahhahhahhaha真棒圖片 –

2

此代碼xrmServiceContext.CreateQuery<T>().Single(query => query.Id == id).ToMaybe();存在問題,因爲如果沒有任何內容與查詢匹配,IQueryable.Single將拋出InvalidOperationException

您需要在這裏使用IQueryable.SingleOrDefault來避免異常並返回空值(假設您需要null)。您仍然需要將其封裝在Try/Catch中以處理諸如數據庫中斷,超時等問題設置Try雖然便宜,但Catch可能很昂貴,所以我們希望避免將它用於邏輯。通過使用SingleOrDefault你處理最常見的例外,因爲該ID不存在,並且允許如果希望使用寫捕捉到只處理意料之外的(網絡故障等)

public static T EntityGet<T>(Guid id, OrganizationServiceContext xrmServiceContext) where T : Entity 
{   
    try 
    { 
     return xrmServiceContext.CreateQuery<T>().SingleOrDefault(query => query.Id == id); 
    } 
    catch (Exception) 
    { 
     // Log the exception or this could create a debugging nightmare down the road!!! 
     return default(T); 
    }    
} 

Functional.Maybe庫可以:

public static Maybe<T> EntityGet<T>(Guid id, OrganizationServiceContext xrmServiceContext) where T : Entity 
{ 
    try 
    { 
     return xrmServiceContext.CreateQuery<T>().SingleOrDefault(query => query.Id == id).ToMaybe(); 
    } 
    catch (Exception) 
    { 
     // Log the exception or this could create a debugging nightmare down the road!!! 
     return Maybe<T>.Nothing; 
    } 
} 
相關問題