如果我用RequestScope.Request注册一个类型,然后在服务中自动注册它,我知道对象的生存期范围将得到尊重。
如果我以非自动连线的方式解析类型,即:
var authRepo = EndpointHost.TryResolve<IAuthenticationRepository>();我怎样才能证实这一点呢?谢谢
发布于 2014-02-02 21:35:34
当使用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);
}
}结果:

因此,在三个不同的请求之后,使用autowire和TryResolve方法,我们可以看到静态的工作和请求的作用域是一样的。
所以使用自动导航或TryResolve,ReuseScope是受人尊敬的。
https://stackoverflow.com/questions/21514212
复制相似问题