3

У меня есть MVCwebApi приложение, которое работает с Unity. Я должен разрешить интерфейс ITest для singleton class (DelegateHandler). Но у интерфейса ITest есть httprequest пожизненный менеджер, и это важно. Поэтому я не могу разрешить ITest на Application_Start, потому что сейчас нет HttpRequest, но DelegateHandler будет использовать ITest только в жизненном цикле httprequest.Единство ленивое решение

Так можно отправить ленивое решение DelegateHandler или, возможно, у кого-нибудь другое интересное решение?

ответ

2

Срок службы службы всегда должен быть равным или короче, чем у его зависимостей, поэтому вы обычно регистрируете ITest как на запрос Http или переходный период, но если это невозможно, оберните зависимость (DelegateHandler, которую я предполагаю), которая имеет А на Http Request жизнь в прокси:

// Proxy 
public class DelegateHandlerProxy : IDelegateHandler 
{ 
    public Container Container { get; set; } 

    // IDelegateHandler implementation 
    void IDelegateHandler.Handle() 
    { 
     // Forward to the real thing by resolving it on each call. 
     this.Container.Resolve<RealDelegateHandler>().Handle(); 
    } 
} 

// Registration 
container.Register<IDelegateHandler>(new InjectionFactory(
    c => new DelegateHandlerProxy { Container = c })); 
+0

Спасибо, очень хороший ответ! –

+0

Было бы здорово преобразовать его в общее решение, но, возможно, это невозможно) –

0

Другим вариантом сделать следующее:

public class Foo 
{ 
    Func<IEnumerable<ITest>> _resolutionFunc; 
    ITest _test; 
    public Foo(Func<IEnumerable<ITest>> resolutionFunc) 
    { 
     _resolutionFunc=resolutionFunc; 
    } 

private void ResolveFuncToInstance() 
{ 
    _test=_resolutionFunc().First(); 
} 
} 

что мы делаем просим Unity, чтобы предоставить нам делегат, который будет решать все ITEST в позиции в контейнере. Поскольку это Func, мы можем называть его всякий раз, когда хотим сделать фактическое разрешение от Unity.

Это делает то же самое, что делает Стивен, но использует встроенную функциональность Unity, чтобы делать то, что мы ищем.

Смежные вопросы