Unity,RegisterType <>和Singleton对象

Yag*_*Yag 6 .net c# singleton dependency-injection unity-container

我正在使用Unity来实例化一些对象,我发现无论我尝试什么,Unity都会为我的对象创建单例.

根据文档: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>();  
Run Code Online (Sandbox Code Playgroud)

但相反,我得到一个单例实例.

以下是我的声明.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>()));  
Run Code Online (Sandbox Code Playgroud)

调节器

private readonly IInStoreRetailersViewModelBuilder _inStoreRetailersViewModelBuilder;  

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

public ActionResult Index()  
{  
    InStoreViewModel viewModel = this._inStoreRetailersViewModelBuilder.WithRetailers().WithPostcode().Build();  
}  
Run Code Online (Sandbox Code Playgroud)

如果我打开Chrome并运行Index操作,然后我去打开Internet Explorer并调用Index操作,在第二次调用时,在构造函数中,注入的inStoreRetailersViewModelBuilder参数是第一次调用时生成的参数(使用Chrome) .

:我使用PerResolveLifetimeManager(),甚至PerHttpRequestLifetime()从此线程尝试- DataContext的单个实例每个Web请求在Unity MVC,EF

但似乎没有什么能给我一个全新的例子.任何人都可以了解我在这里做错了什么?

MLF*_*MLF 9

试试这个,看看它是否有帮助.

container.RegisterType<IInStoreRetailersViewModelBuilder, InStoreRetailersViewModelBuilder>(
new InjectionConstructor(
    new ResolvedParameter<IRetailerService>()));  
container.RegisterType<CollectController>(
new InjectionConstructor(
    new ResolvedParameter<IInStoreRetailersViewModelBuilder>()));  
Run Code Online (Sandbox Code Playgroud)

也许通过自己将参数解析为构造函数,您实际上是在传递一个特定的实例,这导致它是一个单例.

  • 我认为不同之处在于,通过使用Container.Resolve,您将现有对象传递给构造函数,因此它将始终使用该现有对象.使用ResolvedParameter时,Unity每次都会解析一个新对象并将其传递给构造函数.看看你链接到的文档,我认为使用RegisterInstance方法部分使用Lifetime Manager中的第一个示例与您正在执行的操作相同. (3认同)