0

我現在在我的MVC 3項目中遇到了Unity 2的大麻煩。Unity 2在泛型中表現得很奇怪

我已經創建了一個抽象BaseViewPage,所有視圖頁面都從中繼承。在這我有2個依賴。到現在爲止還挺好。 現在我有3個不同的ViewPages從BaseViewPage繼承。這些使用泛型向視圖提供一些特定的數據。到現在爲止還挺好。 現在出現這個問題。 在我的homecontroller中,我使用unity來解析其中一個視圖頁面。當我調試它時正確加載視圖頁,但正好在我的調用返回視圖(「索引」,模型)後;統一調用基本視圖頁面內的其中一個依賴關係。這在httpcontext爲空時完成。

統一配置(加載所有viewpages):

container.RegisterType<IBackendWrapper, BackendWrapper.BackendWrapper>(new PerThreadLifetimeManager()); 
      container.RegisterType<BaseViewPage, EmptyViewPage>("EmptyViewPage"); 
      container.RegisterType(typeof(BaseViewPage), typeof(GenericViewPage<>), "GenericViewPage"); 
      container.RegisterType(typeof(BaseViewPage), typeof(GenericIEnumerableViewPage<>), "GenericIEnumerableViewPage"); 

BaseViewPage和一個通用視圖頁面(其他通用的網頁看起來幾乎一樣):

public abstract class BaseViewPage 
{ 
     [Dependency] 
     public IBackendWrapper Backend { get; set; } 
     .... 
} 

public class GenericViewPage<T> : BaseViewPage 
{ 
    public T Model { get; set; } 

    public GenericViewPage(T model) 
     : base() 
    { 
     Model = model; 
    } 
} 

現在,在我的家鄉控制器I首先依賴於後端(以測試它的工作原理),然後在索引內部我使用統一來解析一個通用視圖頁面:

public class HomeController : Controller 
{ 
    [Dependency] 
    public IBackendWrapper Backend { get; set; } 

    public ActionResult Index(MvcLoginUser user) 
    { 
     var model = UnityGlobalContainer.Container.Resolve<GenericViewPage<MvcLoginUser>>("GenericViewPage"); 
     return View("Index", model); 
    } 
} 

現在返回後,Unity會調用BackendWrapper對象。更確切地說BackendWrapper.UserIdent.TheLogin。由於不存在HttpContext,因此登錄引發錯誤。問題是,爲什麼團結試圖訪問它?我在BackendWrapper內部和UserIdent內實現了一個dispose,但統一忽略它們並仍然調用TheLogin。

Inside the BackendWrapper我有一個構造函數調用外部DLL來創建一個新的UserIdent。所以它沒有任何統一解決。但團結仍然試圖訪問它。 此外,如果我從BaseViewPage中刪除依賴項,它完美的作品。所以只有當BaseViewPage對BackendWrapper有一個依賴時纔會出現這個問題。 我配置正確嗎?

回答

0

我發現這個「Application_EndRequest」被擊中之前統一已經清理它的對象。這反過來終止了我們的NHibernate會話,所以當統一然後試圖處理創建的類內的所有對象時,它會失敗。還沒有弄清楚它爲什麼試圖處理未創建的類。 wrapper類是由unity創建的,而wrapper類又創建了UserIdent。我的猜測是垃圾收集器或其他東西跑了,並試圖通過所有創建的類和他們的子對象。這是在HttpContext之外完成的,這導致了一些例外。