#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.