C # Unity2: решение проблем с генриками при использовании менеджера по жизни - PullRequest
0 голосов
/ 25 ноября 2010

Я использую 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();
    }
}

Любая помощь будет принята с благодарностью!

Спасибо!/ Victor

1 Ответ

1 голос
/ 15 декабря 2010

Если кто-то хочет знать, причина была в том, что пользовательский LifetimeManager использовал тип в качестве входных данных (либо с использованием обобщений, либо в качестве аргумента конструктора).При использовании LifetimeManager для универсального типа, который не будет работать, не делайте этого:)

В конце мы решили использовать {string} + Guid.NewGuid () в качестве ключа.

/ Виктор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...