2011-08-09 7 views
6

Estoy usando Unity para crear instancias de algunos objetos y descubro que no importa lo que intento, Unity está creando singletons para mis objetos.Unity, RegisterType <> y Singleton objects

De acuerdo con la documentación: http://msdn.microsoft.com/en-us/library/dd203242.aspx#Y500

con el siguiente código que debería llegar a una instancia diferente cada vez que la interfaz se resuelva.

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

Pero en vez de eso me da una instancia de singleton.

A continuación se encuentra mi declaración. 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>())); 

controlador

private readonly IInStoreRetailersViewModelBuilder _inStoreRetailersViewModelBuilder; 

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

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

Si abro Chrome y ejecutar la acción índice y, a continuación, voy y explorador de Internet abierta y llamar a la acción index, en la segunda llamada En el constructor, el parámetro inStoreRetailersViewModelBuilder que se inyecta es el generado en la primera llamada (con Chrome).

He intentado usar el PerResolveLifetimeManager() e incluso el PerHttpRequestLifetime() de este hilo: MVC, EF - DataContext singleton instance Per-Web-Request in Unity

Pero nada parece que me diera una marca nueva instancia. ¿Alguien puede arrojar algo de luz sobre lo que puedo estar haciendo mal aquí?

Respuesta

9

Pruebe esto y vea si ayuda.

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

Tal vez por la resolución del parámetro a su constructor de sí mismo que están pasando esencialmente en una instancia específica que da lugar a que sea un producto único.

+0

¡Eso funciona! ¿Cuál es la diferencia entre usar Container.Resolve y el nuevo ResolvedParameter? No soy un experto en Unity y aunque en su mayor parte funciona muy bien, a veces me hace rascar la cabeza. ¡Gracias por la ayuda! – Yag

+3

Creo que la diferencia es que al usar Container.Resolve está pasando un objeto existente al constructor para que siempre use ese objeto existente. Cuando use ResolvedParameter Unity resolverá un nuevo objeto cada vez y lo pasará al constructor. Eche un vistazo a la documentación con la que se vinculó, creo que el primer ejemplo en el uso de Lifetime Manager con la sección RegisterInstance Method es equivalente a lo que estaba haciendo. – MLF

Cuestiones relacionadas