2010-11-25 22 views
0

J'utilise ASP MVC 3 (RC) avec Unity 2 avec beaucoup de succès. Cependant, j'ai un problème que je ne peux pas enrouler ma tête autour. Dans les coulisses, j'utilise POCO (Person, Company, ...) auquel j'accède via des dépôts. Les référentiels sont créés en tant que génériques (EFRepository) et utilisent un contexte. Sans LifetimeManager sur le tout type de référentiel générique fonctionne comme prévu:C# Unity2: Problèmes de résolution de problèmes lors de l'utilisation d'un lifetimemanager

 var container = new UnityContainer(); 
     container 
      .RegisterType<ObjectContext, DataLayerContext>(
       new HttpRequestLifetimeManager<ObjectContext>()) 
      .RegisterType(typeof(IRepository<>), typeof(EFRepository<>)) 

     //Works 
     var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>()); 
     //Works 
     var webPersonRepository = (IRepository<WebPerson>)DependencyResolver.Current.GetService<IRepository<WebPerson>>(); 

Cependant, lors de l'ajout du LifetimeManager au dépôt ainsi, la résolution échoue:

 var container = new UnityContainer(); 
     container 
      .RegisterType<ObjectContext, DataLayerContext>(
       new HttpRequestLifetimeManager<ObjectContext>()) 
      .RegisterType(typeof(IRepository<>), typeof(EFRepository<>), 
       new HttpRequestLifetimeManager(typeof(IRepository<>))) 

     //Works 
     var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>()); 
     //Does NOT work anymore! 
     var webPersonRepository = (IRepository<WebPerson>)DependencyResolver.Current.GetService<IRepository<WebPerson>>(); 

Toutes les idées? La mise en œuvre de la HttpRequestLifetimeManager est très standard:

public class HttpRequestLifetimeManager<T> : HttpRequestLifetimeManager 
{ 
    public HttpRequestLifetimeManager() : base(typeof(T)) 
    { 

    } 
} 

public class HttpRequestLifetimeManager : LifetimeManager, IDisposable 
{ 
    private readonly string _key; 

    public HttpRequestLifetimeManager(Type T) 
    { 
     _key = @"HttpRequestContextLifetimeManager" + T.Name; 
    } 

    public override object GetValue() 
    { 
     return HttpContext.Current.Items[_key]; 
    } 

    public override void RemoveValue() 
    { 
     HttpContext.Current.Items.Remove(_key); 
    } 
    public override void SetValue(object newValue) 
    { 
     HttpContext.Current.Items[_key] = newValue; 
    } 
    public void Dispose() 
    { 
     RemoveValue(); 
    } 
} 

Toute aide serait grandement appréciée!

Merci! /Victor

+0

"Ne fonctionne plus!" signifie qu'il lance une exception? Lequel? Pouvez-vous poster les messages de la chaîne d'exception? – onof

+0

Eh bien, puisque c'est l'idée par conception, elle renvoie null. Fondamentalement, cela signifie qu'il ne peut pas initier la classe. – Victor

Répondre

1

Si quelqu'un veut savoir, la raison en est que le LifetimeManager personnalisé que j'ai utilisé utilisait un type en entrée (soit en utilisant des génériques, soit en tant qu'argument de constructeur). Lorsque vous utilisez LifetimeManager sur un type générique qui échouera, alors ne faites pas cela :)

Finalement, nous avons décidé d'utiliser {string} + Guid.NewGuid() comme clé.

/Victor