0

我使用 ASP MVC 3 (RC) 和 Unity 2 取得了巨大成功。但是,我有一个无法解决的问题。在幕后,我使用通过存储库访问的 POCO (Person, Company, ...)。存储库作为泛型 (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();
    }
}

任何帮助将不胜感激!

谢谢!/胜利者

4

1 回答 1

1

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

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

/胜利者

于 2010-12-15T14:23:30.457 回答