У меня также была точно такая же проблема с использованием ServiceStack версии 4.5.6.
Вот мой код для регистрации
container.RegisterAutoWiredAs<EventConditionalLoadingRepository, IEventConditionalLoadingRepository>()
.ReusedWithin(ReuseScope.Request);
container.RegisterAutoWiredAs<MetaRiskRepository, IMetaRiskRepository>()
.ReusedWithin(ReuseScope.Request);
container.RegisterAutoWiredAs<RiskStoreConnectivityService, IRiskStoreConnectivityService>()
.ReusedWithin(ReuseScope.Request);
container.Register<IUnitOfWork>(c =>
{
return new UnitOfWork();
}).ReusedWithin(ReuseScope.Request);
container.Register(c => (IUnitOfWorkEnlistable)c.Resolve<IUnitOfWork>())
.ReusedWithin(ReuseScope.Request);
И вот мой сервис, который принимает эти зависимости
public AnalysisServiceStackService(
IEventConditionalLoadingRepository eventConditionalLoadingRepository,
IMetaRiskRepository metaRiskRepository,
IUnitOfWork unitOfWork)
{
_eventConditionalLoadingRepository = eventConditionalLoadingRepository;
_metaRiskRepository = metaRiskRepository;
_unitOfWork = unitOfWork;
_log.Information("AnalysisServiceStackService constructed");
}
Вы можете видеть, что у меня есть оператор журнала, который, когда я запускаю эту службу через почтальона для последовательных запросов, я регистрирую такие вещи.
2017-03-30 15:34:10 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:11 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:12 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:13 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:14 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:15 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:16 [Information] AnalysisServiceStackService constructed
2017-03-30 15:34:17 [Information] AnalysisServiceStackService constructed
Итак, я знаю, что сама служба должна пытаться разрешить новый экземпляр PerRequest необходимых ей компонентов IOC.
Если я затем использую Visual Studio и использую функцию отладки «Создать идентификатор объекта», чтобы проверить, что дает мне контейнер IOC, они являются одним и тем же экземпляром.
Звонок 1: первый запрос
см. идентификатор объекта № 1, созданный Visual Studio
Звонок 2: второй запрос
См. идентификатор объекта № 1, который означает, что это тот же экземпляр, которым НЕ должно быть. Это должен быть новый экземпляр для нового запроса
И просто чтобы доказать, что это разные вызовы, вот логи для Конструктора, запускаемого дважды, по одному разу для каждого запроса
Единственное, что исправило это для меня, - это предложенное исправление Reuse.None.
Но если мне нужно это сделать, я могу просто использовать адаптер AutoFac (который я бы предпочел использовать в любом случае) и использовать стандартный AutoFac INstancePerLifeTimeScope: http://docs.autofac.org/en/latest/lifetime/instance-scope.html#instance-per-lifetime-scope
Есть идеи?
person
sacha barber
schedule
30.03.2017