c# - Unity、RegisterType<> 和 Singleton 对象

标签 c# .net dependency-injection singleton unity-container

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

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

使用下面的代码,我应该在每次解析接口(interface)时得到一个不同的实例。

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>()));  

Controller

private readonly IInStoreRetailersViewModelBuilder _inStoreRetailersViewModelBuilder;  

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

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

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

我已尝试使用此线程中的 PerResolveLifetimeManager() 甚至 PerHttpRequestLifetime():MVC, EF - DataContext singleton instance Per-Web-Request in Unity

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

最佳答案

试试这个,看看是否有帮助。

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

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

关于c# - Unity、RegisterType<> 和 Singleton 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6999056/

相关文章:

c# - Entity Framework (实体类)序列化

c# - WPF 工具包 DataGrid 列调整大小事件

c# - 注册定时器流逝事件

c# - 机器人仿真器框架无法解析服务

c# - 从 LinkBut​​ton 下载时文件损坏

c# - 如何计算我的应用程序中的在线用户数?

.net - 是否有可能获得相当于 .net 对象的 'memory address' 的值?

java - 以尽可能少的更改动态地(在运行时)更改持久层

c# - 无法转换类型为 'Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope' 的对象

c# - 在 Xamarin.Android 和 MvvmCross 中定义应用程序类的基类