2

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>()、何も起こらないことがわかります。誰かが同様の問題を抱えていて、どのように修正しましたか?

回答をいただければ幸いです。

4

0 に答える 0