ServiceStack Funq RequestScope
Если я зарегистрирую тип с RequestScope.Request
и затем я автоматически связываю его с сервисом, я знаю, что срок действия объекта будет соблюдаться.
Будет ли это также верно, если я разрешу тип не автоматически, например:
var authRepo = EndpointHost.TryResolve<IAuthenticationRepository>();
И как я могу это подтвердить? Спасибо
1 ответ
Будет ли соблюден срок службы при использовании TryResolve
вместо автопровода? Да.
Вы можете подтвердить это, настроив проект, в котором вы проверяете время жизни зависимости. Я создал тестовый проект, чтобы продемонстрировать это.
Полный исходный код здесь.
Я создал 4 зависимости; 2, которые являются автоматически связанными и состоят из зависимости, которая будет сохраняться (статическая) во всех запросах, а другая - только для запроса. Другие 2 зависимости создаются с одинаковыми ReuseScope
s, но они не имеют автоматической проводки и будут решены при использовании TryResolve
метод. Таким образом:
container.RegisterAutoWiredAs<AutoStatic, IAutoStatic>();
container.RegisterAutoWiredAs<AutoRequest, IAutoRequest>().ReusedWithin(ReuseScope.Request);
container.Register<IResolveStatic>(c => new ResolveStatic());
container.Register<IResolveRequest>(c => new ResolveRequest()).ReusedWithin(ReuseScope.Request);
Когда каждая из зависимостей создается, их метод конструктора устанавливает время, когда они были созданы на CreatedAt
имущество.
public class AutoStatic : IAutoStatic
{
public string CreatedAt { get; set; }
public AutoStatic() { CreatedAt = DateTime.Now.ToString(); }
}
...
Статические зависимости т.е. ReuseScope.Default
всегда должен показывать время первого запроса по всем запросам. Зависимости, ограниченные как ReuseScope.Request
всегда должно быть новое время создания для каждого запроса.
Итак, наш простой сервис, который докажет это:
public class TestController : Service
{
public IAutoStatic AutoStatic { get; set; }
public IAutoRequest AutoRequest { get; set; }
IResolveStatic ResolveStatic { get; set; }
IResolveRequest ResolveRequest { get; set; }
public void Get(TestRequest request)
{
ResolveStatic = EndpointHost.TryResolve<IResolveStatic>();
ResolveRequest = EndpointHost.TryResolve<IResolveRequest>();
Console.WriteLine("-NEW REQUEST-");
Console.WriteLine("Auto Static {0}", AutoStatic.CreatedAt);
Console.WriteLine("Resolve Static {0}", ResolveStatic.CreatedAt);
Console.WriteLine("Auto Request {0}", AutoRequest.CreatedAt);
Console.WriteLine("Resolve Request {0}", ResolveRequest.CreatedAt);
}
}
Результаты, достижения:
Таким образом, после 3-х различных запросов, используя как AutoWire и TryResolve
Метод, мы видим, что статическая работа, как ожидалось, и запрос также ограничены.
Так что используйте autowire или TryResolve
ReuseScope
уважается.