ServiceStack Funq RequestScope

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

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

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

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


person Cristóvão    schedule 02.02.2014    source источник


Ответы (1)


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

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

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

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

Так что используйте autowire или TryResolve ReuseScope соблюдается.

person Scott    schedule 02.02.2014