代码之家  ›  专栏  ›  技术社区  ›  Victor

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

  •  0
  • Victor  · 技术社区  · 14 年前

    我正在使用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<>))
    
            //Works
            var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>());
            //Works
            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<>)))
    
            //Works
            var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>());
            //Does NOT work anymore!
            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();
        }
    }
    

    任何帮助都将不胜感激!

    谢谢! /维克多

    1 回复  |  直到 14 年前
        1
  •  1
  •   Victor    14 年前

    如果有人想知道,原因是我使用的自定义LifetimeManager使用类型作为输入(使用泛型或构造函数参数)。在将失败的泛型类型上使用LifetimeManager时,请不要这样做:)

    最后,我们决定使用{string}+Guid.NewGuid()作为键。

    /维克多