我使用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
,但似乎沒有給我一個全新的實例。任何人都可以在這裏瞭解我可能做錯了什麼?
工作!使用Container.Resolve和新的ResolvedParameter有什麼區別?我不是Unity的專家,儘管它的大部分功能都很棒,但有時它讓我撓頭。謝謝您的幫助! – Yag
我認爲不同之處在於,通過使用Container.Resolve將現有對象傳遞給構造函數,以便始終使用該現有對象。當您使用ResolvedParameter時,Unity會每次解析一個新對象並將其傳遞給構造函數。看看你鏈接到的文檔,我認爲使用Lifetime Manager和RegisterInstance方法部分的第一個例子等價於你在做什麼。 – MLF