2011-10-12 44 views
0

嗨創建了一個擴展方法來控制EF上下文的生命週期。我的代碼是低於httpcontext擴展和IOC注意事項

public static Entities GetCentralRepositoryContext(this HttpContext httpcontext) 
{ 
    if (HttpContext.Current.Items["context"] == null) 
    { 
     HttpContext.Current.Items["context"] = new Entities(); 
    } 

    return (Entities)HttpContext.Current.Items["context"]; 
} 

我在解決方案中創建了許多圖層作爲項目,並開始考慮IOC。上面的代碼位於我的BL層項目中,但是爲了使其工作,我需要創建對DL層的引用,因爲這是實體類所在的位置。我如何刪除對DL層的引用並注入我的擴展方法。這甚至有可能嗎?

回答

1

您正在採取的方法有幾個問題。首先,靜態方法往往是鬆散耦合的一個問題,當你嘗試單元測試你的代碼時你會注意到這一點。除此之外,您的業務層依賴於System.Web,這使您的業務層技術特定,這將使得將部分系統移動到例如Windows服務非常困難,並且再次使單元測試幾乎不可能。

而不是這樣做,開始將Entities類注入到所有需要它的類型的構造函數中。在每個請求開始時,您可以在您的應用程序中構建特定於該請求的服務依賴關係圖。此時,您可以確定Entities實例應具有Web請求的生命週期。

但是,如果沒有DI框架,這會變得非常麻煩。或者至少,DI框架將使這更容易做到。

當您開始編寫單元測試時,您會發現在您的應用程序中直接使用EF ObjectContext會非常困難。 This article可能會給你一些想法如何抽象ObjectContext後面的可測試接口。