1

以前我設法設置我的統一性,每次提供一個新的DataContext到我的Repository項目。它效果很好。Unity:在application_BeginRequest中使用相同的datacontext?

但是,例如,我在一個WCF方法,打開2個服務,這反過來打開2個資料庫(存儲庫模式)..我希望能夠在同一個wcf方法內重複使用相同的datacontext。

所以我一直在尋找RegisterInstance,但我檢查了datacontext的GetHashCode及其每次不同。我認爲團結將首先檢查兒童容器每次我認爲我有一個實例設置 - 見下面

這是我的團結,執行一次!

container.RegisterType<MyDataContext>(new TransientLifetimeManager(), 
     new InjectionConstructor()) 

然後我嘗試下的Application_BeginRequest在Global.asax的配置 - 但也許因爲它似乎進入了多次,這是不理想..運行WCF服務,即使有人調用WCF方法

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     Bootstrapper.ConfigureDataContextContainer(); 
    } 

這裏是我的configureDataContextContainer

public static void ConfigureDataContextContainer() 
    { 
     if (childContainer == null) // I have to do this otherwise it executes multiple times. 
     { 
      childContainer = Bootstrapper.Container.CreateChildContainer(); 
      childContainer.RegisterInstance<MyDataContext> 
(container.Resolve<MyDataContext>()); // I Presume i create an instance here 
     } 
    } 

正如我在WCF方法說我出口2個服務,這反過來又開闢了「自己的」程序存儲庫內搭s在一個DataContext

要解決問題的BeginRequest我可以註冊datacontext作爲一個實例(如果它的工作:-))每個WCF方法我有,但它似乎有點漫長。

當然,它的輸入是每個連接(不是會話)都有自己的DataContext。

我在處理datacontext的時候處理了我的倉庫...現在(如果我能得到它的工作)我認爲我需要在EndRequest中處理這個..否則,如果一個服務完成並處置DataContext和其他服務沒有finsihed然後我會得到問題。

我希望我已經很好地解釋了這一點,:-)

總結是每個WCF方法必須使用自己的DataContext的,一個Web方法可以致電超過1個服務(庫模式),這反過來將調用其這個存儲庫需要在構造函數上使用datacontext註冊 - 但是當前在同一個WCF方法中,多個服務會調用這些存儲庫,並且它們會獲得自己的DataContext。

如果我能澄清什麼,請讓我知道

感謝

編輯

忘記提到我是多麼的團結得到解決的事情...我簡單的調用這個容器(不子容器)上,後者又調用程序存儲庫

using (IOfficeService officeService = Bootstrapper.Container.Resolve<IOfficeService >()) 
     { 

回答

3

您在子容器註冊實例,所以你必須解決您的服務時使用的子容器服務(另外,你應該配置上Application_EndRequest孩子容器):

using (var service = childContainer.Resolve<IOfficeService >()) 
{ 
} 

但是,使用PerRequestLifetimeManager應該完成同樣的事情:

Container.RegisterType<MyDataContext>(new PerRequestLifetimeManager()); 

這裏是我如何實現它:

public class PerRequestLifetimeManager : LifetimeManager { 
    private Guid key; 

    public PerRequestLifetimeManager() { 
     key = Guid.NewGuid(); 
    } 

    public override object GetValue() { 
     if (HttpContext.Current == null) { 
      return null; 
     } else { 
      return HttpContext.Current.Items[key]; 
     } 
    } 

    public override void RemoveValue() { 
     if (HttpContext.Current != null) { 
      HttpContext.Current.Items.Remove(key); 
     } 
    } 

    public override void SetValue(object newValue) { 
     if (HttpContext.Current != null) { 
      HttpContext.Current.Items.Add(key, newValue); 
     } 
    } 
} 
+0

謝謝邁克爾,但「PerRequestLifetimeManager」將會給整個同樣的DataContext - 即在每一個進來的請求?因此調用不同wcf方法的不同客戶端都將獲得相同的DataContext? – 2009-11-08 23:34:28

+0

這意味着在請求中將返回相同的實例。基本上,每個請求都會有它自己的單例。不同的客戶端不會共享同一個實例。 – 2009-11-08 23:59:12

+0

太棒了,我一開始是在摸我的頭,因爲我找不到perRequestLifeTimeManager ..但我設法在網上找到一個...它完美的工作..謝謝。 – 2009-11-09 10:55:28

相關問題