Автоматическое удаление ServiceStack

#c# #servicestack

#c# #servicestack

Вопрос:

Я новичок в ServiceStack и пытался его использовать. У меня есть вопрос: из документации, которую я прочитал, что «ServiceStack вызывает Dispose() только для зависимостей, разрешенных в запросах ServiceStack, т. Е. Он отслеживает любые одноразовые файлы, разрешенные из Funq, и удаляет их в конце запроса ServiceStack». Что это значит? Ниже вы можете увидеть мой пример кода: в этом случае я пытался избавиться от JsonServiceClient, используя свойство lazy в базовом классе, но 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; }
}
  

Заранее спасибо.

Ответ №1:

Прежде всего, вам не нужно утилизировать JsonServiceClient , поскольку он не сохраняет никаких ресурсов, а его Dispose() является NOOP.

Я бы также рекомендовал не использовать зависимости с областью действия запроса, в основном, если ваши зависимости используют только потокобезопасные зависимости, зарегистрируйте их как одноэлементные (по умолчанию):

 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 вызывает Dispose() только для зависимостей, разрешенных в запросах ServiceStack, т. Е. Он отслеживает любые одноразовые файлы, разрешенные из Funq, и удаляет их в конце запроса ServiceStack.». Что это значит?

Это просто означает, что если ServiceStack разрешает и внедряет ваши зависимости, например, в ваши службы ServiceStack, то ServiceStack также удалит их. Но если вы самостоятельно разрешаете зависимости от IOC, вам нужно будет явно избавиться от них, обычно с using помощью, например:

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

Комментарии:

1. Спасибо, @mythz! JsonServiceClient не нужно утилизировать, потому что за ним нет пула соединений, верно? Другой вопрос: предположим, что вместо JsonServiceClient используется IDbConnection: основываясь на вашем ответе, я не смог зарегистрировать его в IOC и использовать класс репозитория (со свойством IDbConnection внутри него) в контроллере, который расширяет ServiceStackController и автоматически ServiceStack удаляет соединение? Когда вы говорите о сервисе ServiceStack, ссылаетесь ли вы на класс, который расширяет сервис? Извините, если мои вопросы кажутся нубами…

2. @Developer Его не нужно удалять, потому что он не сохраняет никаких ресурсов. Он использует .NET HttpWebRequest, который поддерживает собственное использование ресурсов за кулисами, но это не видно в коде конечного пользователя. Вы не должны вводить IDbConnection , регистрировать и разрешать IDbConnectionFactory вместо этого. Если использовать свойство lazy IDbConnection, например Service , тогда ваш dep должен быть временным. Да ServiceStackController (и база. Реквизиты базы данных) удаляются ServiceStack.