ServiceStack 自动配置

ServiceStack automatic dispose

我是 ServiceStack 的新手,我正在尝试使用它。我有一个问题要解决:从我读到的文档中,“ServiceStack 仅在 ServiceStack 请求中解决的依赖项上调用 Dispose(),即它跟踪从 Funq 解决的任何一次性用品并在 ServiceStack 结束时处理它们请求。”。这是什么意思?您可以在下面看到我的示例代码:在这种情况下,我试图在基础 class 中使用惰性 属性 处理 JsonServiceClient,但未调用 Dispose()。你能给我解释一下它是如何工作的吗?

class Program
{
    static void Main(string[] args)
    {
        new AppHost().Init();
        var test = HostContext.AppHost.Container.TryResolve<Worker>();
        test.DoWork();
    }
}

public abstract class BaseWorker : IDisposable
{
    private JsonServiceClient client;
    public JsonServiceClient Client => client ??  (client = new JsonServiceClient());

    public virtual void Dispose()
    {
        client?.Dispose();
    }
}

public class Worker : BaseWorker
{
    public void DoWork()
    {
        var res = Client.ToPostUrl();
    }
}

public class AppHost : AppHostBase
{

    public AppHost() : base("Services", typeof(AppHost).Assembly)
    { }

    public override void Configure(Container container)
    {
        container.Register<Worker>(c => new Worker()).ReusedWithin(ReuseScope.Request);
    }
}

public class StoreGist : IReturn<StoreGistResponse> { }

public class StoreGistResponse
{
    public string Date { get; set; }
}

提前致谢。

首先你不需要处理 JsonServiceClient 因为它不保留任何资源而且它的 Dispose() 是一个 NOOP。

我也会 recommend against using Request Scoped dependencies,基本上,如果您的依赖项仅使用 ThreadSafe 依赖项,请将其注册为单例(默认):

container.AddSingleton(c => new Worker()); //Equivalent to:
container.Register(c => new Worker());

否则将其注册为瞬态依赖,例如:

container.AddTransient(c => new Worker()); //Equivalent to:
container.Register(c => new Worker()).ReusedWithin(ReuseScope.None);

"ServiceStack only calls Dispose() on dependencies resolved within ServiceStack Requests, i.e. it tracks any disposables resolved from Funq and disposes of them at the end of a ServiceStack request.". What does it mean?

这只是意味着 ServiceStack 是否正在解析并注入您的依赖项,例如在你的 ServiceStack 服务中,然后 ServiceStack 也会处理它们。但是,如果您自己从 IOC 解决依赖关系,则需要显式处理它们,通常使用 using,例如:

using var test = HostContext.AppHost.Container.TryResolve<Worker>();
test.DoWork();