ServiceStack を使用するプロジェクトがいくつかあります。IEnumerable の解決に奇妙な問題があります。いくつかのロジックを実装する 6 つのサービスと、それらを管理する 1 つのサービスがあります。
これは私のサービスのコードです:
public class TerminologyManagerService : ITerminologyManagerService
{
readonly IEnumerable<ITerminologyRetriever> _terminologyRetrievers;
public TerminologyManagerService(IEnumerable<ITerminologyRetriever> terminologyRetrievers)
{
_terminologyRetrievers = terminologyRetrievers;
}
public IEnumerable<ITerminologyRetriever> GetTerminologyRetrievers(string name)
{
return _terminologyRetrievers
.Where(x => x.CanHandle(name))
.OrderByDescending(x => x.Priority);
}
}
これは WindsorContainerAdapter です。
public class WindsorContainerAdapter : IContainerAdapter, IDisposable
{
readonly IWindsorContainer _container;
public WindsorContainerAdapter(IWindsorContainer container)
{
_container = container;
}
public T TryResolve<T>()
{
if (_container.Kernel.HasComponent(typeof (T)))
return (T) _container.Resolve(typeof (T));
return default(T);
}
public T Resolve<T>()
{
return _container.Resolve<T>();
}
public void Dispose()
{
_container.Dispose();
}
}
これは WindsorDependencyResolver です。
class WindsorDependencyResolver : IDependencyResolver
{
readonly IKernel _container;
public WindsorDependencyResolver(IKernel container)
{
_container = container;
}
public IDependencyScope BeginScope()
{
return new WindsorDependencyScope(_container);
}
public object GetService(Type serviceType)
{
return _container.HasComponent(serviceType)
? _container.Resolve(serviceType)
: null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType).Cast<object>();
}
public void Dispose()
{
}
class WindsorDependencyScope : IDependencyScope
{
readonly IKernel _container;
readonly IDisposable _scope;
public WindsorDependencyScope(IKernel container)
{
_container = container;
_scope = container.BeginScope();
}
public object GetService(Type serviceType)
{
return _container.HasComponent(serviceType)
? _container.Resolve(serviceType)
: null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType).Cast<object>();
}
public void Dispose()
{
_scope.Dispose();
}
}
}
これは私の RestApi クラスです:
public class RestApi : AppHostBase
{
readonly IWindsorContainer _container;
public RestApi(IWindsorContainer container) : base("REST Api", Assembly.GetExecutingAssembly())
{
LogManager.LogFactory = new Log4NetFactory(true);
_container = container;
}
public override void Configure(Container container)
{
container.Adapter = new WindsorContainerAdapter(_container);
RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
if (requestDto is BaseRequest)
{
var baseRequest = requestDto.Cast<BaseRequest>();
SystemId systemId = SystemId.Parse(baseRequest.SystemId);
container.Resolve<IOpenHealthEnvironment>().Init(systemId);
}
});
}
}
私は奇妙な振る舞いをしています: 私のプログラムがデータを取得するのが遅すぎることがあります。プログラムをデバッグすると、ブレークポイントがオンラインで停止し_container.Resolve<T>()
、何も起こらないことがわかります。誰かが同様の問題を抱えていて、どのように修正しましたか?
回答をいただければ幸いです。