Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics C#Unit2:使用lifetimemanager时解决genrics问题_Generics_C# 4.0_Unity Container_Lifetime - Fatal编程技术网

Generics C#Unit2:使用lifetimemanager时解决genrics问题

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

我正在使用ASP MVC 3(RC)和Unity 2,并取得了巨大成功。然而,我有一个问题,我不能缠绕我的头。在幕后,我使用通过存储库访问的POCO(个人、公司等)。存储库作为泛型(eRefepository)创建,并使用上下文。如果通用存储库类型上没有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>>();
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。基本上,这意味着它不能启动类。