2011-08-09 24 views
6

我使用Unity實例化一些對象,我發現無論我嘗試什麼,Unity都爲我的對象創建單例。Unity,RegisterType <>和Singleton對象

根據文檔: http://msdn.microsoft.com/en-us/library/dd203242.aspx#Y500

用下面的代碼我應每隔接口得到解決時得到一個不同的實例。

IUnityContainer myContainer = new UnityContainer(); 

// Register a default (un-named) type mapping with a transient lifetime 
myContainer.RegisterType<IMyObject, MyRealObject>(); 
// Following code will return a new instance of MyRealObject 
myContainer.Resolve<IMyObject>(); 

但相反,我得到一個單例實例。

以下是我的聲明。 的Global.asax

// This should get me a singleton 
container.RegisterType<IRetailerService, RetailerService>(new ContainerControlledLifetimeManager(), new InjectionConstructor()); 
// This is the one giving me trouble. 
container.RegisterType<IInStoreRetailersViewModelBuilder, InStoreRetailersViewModelBuilder>(new InjectionConstructor(container.Resolve<IRetailerService>())); 
container.RegisterType<CollectController>(new InjectionConstructor(container.Resolve<IInStoreRetailersViewModelBuilder>())); 

控制器

private readonly IInStoreRetailersViewModelBuilder _inStoreRetailersViewModelBuilder; 

public CollectController(IInStoreRetailersViewModelBuilder inStoreRetailersViewModelBuilder) 
{ 
    this._inStoreRetailersViewModelBuilder = inStoreRetailersViewModelBuilder; 
} 

public ActionResult Index() 
{ 
    InStoreViewModel viewModel = this._inStoreRetailersViewModelBuilder.WithRetailers().WithPostcode().Build(); 
} 

如果我打開Chrome和運行索引操作,然後我去打開Internet Explorer,並調用Index操作,在第二次調用,在構造函數中,注入的inStoreRetailersViewModelBuilder參數是第一次調用(使用Chrome)生成的參數。

我使用PerResolveLifetimeManager(),甚至PerHttpRequestLifetime()從這個線程嘗試:MVC, EF - DataContext singleton instance Per-Web-Request in Unity

,但似乎沒有給我一個全新的實例。任何人都可以在這裏瞭解我可能做錯了什麼?

回答

9

試試這個,看看它是否有幫助。

container.RegisterType<IInStoreRetailersViewModelBuilder, InStoreRetailersViewModelBuilder>(
new InjectionConstructor(
    new ResolvedParameter<IRetailerService>())); 
container.RegisterType<CollectController>(
new InjectionConstructor(
    new ResolvedParameter<IInStoreRetailersViewModelBuilder>())); 

也許自己解析參數構造函數,你基本上是在傳遞導致它是一個單一個特定的實例。

+0

工作!使用Container.Resolve和新的ResolvedParameter有什麼區別?我不是Unity的專家,儘管它的大部分功能都很棒,但有時它讓我撓頭。謝謝您的幫助! – Yag

+3

我認爲不同之處在於,通過使用Container.Resolve將現有對象傳遞給構造函數,以便始終使用該現有對象。當您使用ResolvedParameter時,Unity會每次解析一個新對象並將其傳遞給構造函數。看看你鏈接到的文檔,我認爲使用Lifetime Manager和RegisterInstance方法部分的第一個例子等價於你在做什麼。 – MLF

相關問題