ServiceStack Funq RequestScope

时间:2014-02-02 18:07:44

标签: servicestack funq servicestack-bsd

如果我使用RequestScope.Request注册一个类型,然后我在服务中自动装配它,我知道对象的生命周期范围将得到尊重。

如果我以非自动连接方式解析类型,即:

,这是否也适用
var authRepo = EndpointHost.TryResolve<IAuthenticationRepository>();

另外我该如何确认? 感谢

1 个答案:

答案 0 :(得分:3)

使用TryResolve代替autowire时,是否会尊重生命周期范围?是。

您可以通过设置测试依赖性生命周期的项目来确认这一点。 我创建了一个测试项目来证明这一点。

Full source code here.

我创造了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);
    }
}

结果:

Output

因此,在使用autowire和TryResolve方法的3个不同请求之后,我们看到静态工作符合预期,请求范围同样如此。

因此,请使用autowire或TryResolve尊重ReuseScope