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