Generics C#Unit2:使用lifetimemanager时解决genrics问题
我正在使用ASP MVC 3(RC)和Unity 2,并取得了巨大成功。然而,我有一个问题,我不能缠绕我的头。在幕后,我使用通过存储库访问的POCO(个人、公司等)。存储库作为泛型(eRefepository)创建,并使用上下文。如果通用存储库类型上没有LifetimeManager,则一切都会按预期工作:Generics C#Unit2:使用lifetimemanager时解决genrics问题,generics,c#-4.0,unity-container,lifetime,Generics,C# 4.0,Unity Container,Lifetime,我正在使用ASP MVC 3(RC)和Unity 2,并取得了巨大成功。然而,我有一个问题,我不能缠绕我的头。在幕后,我使用通过存储库访问的POCO(个人、公司等)。存储库作为泛型(eRefepository)创建,并使用上下文。如果通用存储库类型上没有LifetimeManager,则一切都会按预期工作: var container = new UnityContainer(); container .RegisterType<Ob
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>>();
var container=newunitycontainer();
容器
.RegisterType(
新的HttpRequestLifetimeManager())
.RegisterType(typeof(IRepository)、typeof(eRepository))
//工作
var unitOfWork=(IUnitOfWork)DependencyResolver.Current.GetService());
//工作
var webPersonRepository=(IRepository)DependencyResolver.Current.GetService();
但是,将LifetimeManager添加到存储库时,解析失败:
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>>();
var container=newunitycontainer();
容器
.RegisterType(
新的HttpRequestLifetimeManager())
.注册类型,
新的HttpRequestLifetimeManager(类型(IRepository)))
//工作
var unitOfWork=(IUnitOfWork)DependencyResolver.Current.GetService());
//不工作了!
var webPersonRepository=(IRepository)DependencyResolver.Current.GetService();
有什么想法吗?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();
}
}
公共类HttpRequestLifetimeManager:HttpRequestLifetimeManager
{
公共HttpRequestLifetimeManager():基(类型(T))
{
}
}
公共类HttpRequestLifetimeManager:LifetimeManager,IDisposable
{
私有只读字符串\u密钥;
公共HttpRequestLifetimeManager(T型)
{
_key=@“HttpRequestContextLifetimeManager”+T.名称;
}
公共重写对象GetValue()
{
返回HttpContext.Current.Items[_key];
}
public override void RemoveValue()
{
HttpContext.Current.Items.Remove(_键);
}
公共覆盖无效设置值(对象新值)
{
HttpContext.Current.Items[\u key]=newValue;
}
公共空间处置()
{
RemoveValue();
}
}
任何帮助都将不胜感激
谢谢!
/Victor如果有人想知道,原因是我使用的自定义LifetimeManager使用了一个类型作为输入(使用泛型或构造函数参数)。在将失败的泛型类型上使用LifetimeManager时,请不要这样做:) 最后,我们决定使用{string}+Guid.NewGuid()作为键
/Victor“不再工作!”表示它抛出异常?哪一个?你能发布异常链的消息吗?好吧,因为这是设计的想法,所以它返回null。基本上,这意味着它不能启动类。