【问题标题】:ServiceStack Funq RequestScopeServiceStack Funq 请求范围
【发布时间】:2014-02-02 18:07:43
【问题描述】:

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

如果我以非自动连接方式解析类型,这是否也适用,即:

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

另外,我该如何确认? 谢谢

【问题讨论】:

    标签: servicestack funq servicestack-bsd


    【解决方案1】:

    在使用TryResolve 而不是自动装配时,是否会尊重生命周期范围?是的。

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

    Full source code here.

    我创建了 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 是受尊重的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多