2011-10-29 158 views
0

我在我的項目中使用Unity 2.0與asp.net mvc3。當我嘗試在我的Repository類中嘗試配置TestEntities : ObjectContext時,會引發異常。統一2.0國際奧委會與實體框架

public class UserRepository:IUser 
{ 
    //TestEntities ctx = new TestEntities(); 
    [Dependency] 
    public TestEntities ctx { get; set; } 
    //... 
} 

這是異常消息:

類型TestEntities具有長度爲1的多個構造無法消除歧義。

XML配置:

<?xml version="1.0" encoding="utf-8" ?> 
<unity xmlns="schemas.microsoft.com/practices/2010/unity"> 
    <container> 
     <register type="DomainModel.Entity.TestEntities, DomainModel" 
        mapTo="DomainModel.Entity.TestEntities, DomainModel"> 
      <lifetime type="perthread"/> 
     </register> 
     <register type="DomainModel.Abstract.IUser, DomainModel" 
        mapTo="DomainModel.Concrete.UserRepository, DomainModel"> 
      <lifetime type="perthread"/> 
     </register> 
    </container> 
</unity> 
+0

對於格式的抱歉。 – user1019359

回答

3

完全是不正確的配置。首先你正在使用每線程的生命週期。每線程生命週期適用於您自己控制線程的情況,但在ASP.NET MVC中您沒有這種控制。 ASP.NET MVC在內部使用線程池,因此線程被重複用於後續請求=您的上下文將在請求中重用,並且會導致您a lot of problems。另一個問題是上下文的每線程生命週期will not handle disposal所以除非你自己處理它(如果你的控制線程沒有生存期,那麼這很難),你的應用程序就足夠大內存泄漏了。

您必須使用不同的生命週期管理:

  • 每決心:這將每次創建新實例調用Resolve在容器上,但在依賴層次結構的情況下,同一個實例將用於所有注射。你必須自己處理背景處理。
  • 瞬態:每次您撥打Resolve時都會創建新實例。如果實例在依賴關係層次中需要多次,它將爲每次注入創建一個新實例。你必須自己處理背景處理。
  • 分層:您必須爲每個請求處理創建新的子容器,並在此子容器上解析實例。每當您在該子容器實例上調用Resolve時,將使用相同的實例。一旦完成請求,您必須處理子容器,並且所有具有分層生存期的實例也將被處置。
  • 自定義生命期管理器像this per-request example,但具有正確的依賴注入配置,這不應該需要,並且每個解決方案或分層管理器應該解決您的所有需求。

更多關於不同的終生管理者在my article

給你的問題TestEntities類。 Unity會默認嘗試使用具有最多參數的構造函數,並使用依賴注入來解析這些參數。如果它會找到多個這樣的構造函數,它會拋出這個錯誤,因爲它不知道選擇哪一個。即使只有一個,你也會得到錯誤,因爲這樣的構造函數的依賴不會被解決。你必須明確地告訴Unity你想調用哪個構造函數。這將迫使Unity使用默認構造函數代替:

<register type="DomainModel.Entity.TestEntities, DomainModel" 
      mapTo="DomainModel.Entity.TestEntities, DomainModel"> 
    <lifetime type="perresolve"/> 
    <constructor /> 
</register> 
+0

非常感謝。請給我更多關於「處理情況處置」的信息。 – user1019359

+0

只需要在不再需要的情況下處理上下文,並且由於上下文只應用於單個邏輯操作(工作單元),因此可能會經常發生。例如,在Web應用程序或Web服務中,通常每個請求都有單個上下文。在表單應用程序中,每個表單或演示者可以有一個上下文。 –

+0

謝謝。 我真的很感激,如果你有時間檢查另一個問題: [link](http://stackoverflow.com/questions/7953635/unity-2-0-ioc-configuration-about-generic-class) – user1019359