我正在使用ASP MVC 3(RC)与Unity 2取得巨大成功。然而,我有一个问题,我不能包扎我的头。在幕后,我使用POCO(个人,公司,…)通过存储库访问。存储库作为泛型(EFRepository)创建,并使用上下文。如果通用存储库类型上没有LifetimeManager,则一切都将按预期工作:
var container = new UnityContainer();
container
.RegisterType<ObjectContext, DataLayerContext>(
new HttpRequestLifetimeManager<ObjectContext>())
.RegisterType(typeof(IRepository<>), typeof(EFRepository<>))
var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>());
var webPersonRepository = (IRepository<WebPerson>)DependencyResolver.Current.GetService<IRepository<WebPerson>>();
但是,将LifetimeManager添加到存储库时,解析也会失败:
var container = new UnityContainer();
container
.RegisterType<ObjectContext, DataLayerContext>(
new HttpRequestLifetimeManager<ObjectContext>())
.RegisterType(typeof(IRepository<>), typeof(EFRepository<>),
new HttpRequestLifetimeManager(typeof(IRepository<>)))
var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>());
var webPersonRepository = (IRepository<WebPerson>)DependencyResolver.Current.GetService<IRepository<WebPerson>>();
有什么想法吗?HttpRequestLifetimeManager的实现非常标准:
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();
}
}
任何帮助都将不胜感激!
谢谢!
/维克多