ServiceStack Funq RequestScope

Если я зарегистрирую тип с RequestScope.Requestи затем я автоматически связываю его с сервисом, я знаю, что срок действия объекта будет соблюдаться.

Будет ли это также верно, если я разрешу тип не автоматически, например:

var authRepo = EndpointHost.TryResolve<IAuthenticationRepository>();

И как я могу это подтвердить? Спасибо

1 ответ

Решение

Будет ли соблюден срок службы при использовании TryResolve вместо автопровода? Да.

Вы можете подтвердить это, настроив проект, в котором вы проверяете время жизни зависимости. Я создал тестовый проект, чтобы продемонстрировать это.

Полный исходный код здесь.

Я создал 4 зависимости; 2, которые являются автоматически связанными и состоят из зависимости, которая будет сохраняться (статическая) во всех запросах, а другая - только для запроса. Другие 2 зависимости создаются с одинаковыми ReuseScopes, но они не имеют автоматической проводки и будут решены при использовании 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 уважается.

Другие вопросы по тегам