2

If I register a type with RequestScope.Request, and then I autowire it in a service, I know the object's lifetime scope will be respected.

Will this also hold true if I resolve the type in a non auto wired way, i.e.:

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

Also how can I confirm this? Thanks

4

1 回答 1

3

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应始终显示所有请求的第一次请求时间。范围为 as 的依赖项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方法,我们看到静态工作按预期工作,并且请求范围同样。

TryResolve所以使用 autowire 或ReuseScope尊重。

于 2014-02-02T21:35:34.207 回答