组件已注册,但也在等待依赖项

时间:2014-07-24 18:30:24

标签: c# dependency-injection castle-windsor

我有一些Castle Windsor组件注册,如下所示。

container.Register(
    Component.For<IService>()
        .Named("proxy-service")
        .ImplementedBy<ProxyService>()
        .DependsOn(Dependency.OnComponent(
            typeof(IHttpClient), "backend-http-client")),
    Component.For<IHttpClient>()
        .Named("backend-http-client")
        .ImplementedBy<DefaultHttpClient>()
        .DependsOn(Dependency.OnAppSettingsValue(
            "baseAddress", "backendServerBaseAddress"))
);
  • ProxyService实现了IService,并且有一个构造函数,只需要一个IHttpClient

  • DefaultHttpClient实现了IHttpClient,并且有一个构造函数,其中包含一个名为string的{​​{1}}。

现在,如果我尝试通过调用baseAddress来测试我的注册,则会出现以下异常。

  

Castle.MicroKernel.Handlers.HandlerException:无法创建组件&#39;代理服务&#39;因为它有依赖性来满足。

     

&#39;代理服务&#39;正在等待以下依赖项:
   - 组件&#39;后端-http-client&#39; (通过覆盖)已注册,但也在等待依赖。

以下两项工作都很奇怪。

  1. container.Resolve<IService>("proxy-service")
  2. 切换container.Resolve<IHttpClient>("backend-http-client")"proxy-service"注册的排序。
  3. 我真的很难过,因为我经常使用Castle Windsor,并且从来没有遇到过这样的问题,这显然不是由注册中的错字或错误造成的。

    为什么(1)上面的工作,但解决单独依赖它的组件?

    为什么(2)使其有效?注册顺序不应该重要,除非同一界面有多个注册(在我的最小减少情况下没有注册)。我有其他项目的代码,它们使用许多不同的注册做同样的事情。

    我遗失了一些明显错误的东西吗?

2 个答案:

答案 0 :(得分:3)

问题是我的小测试是在安装之前在安装程序内部运行的。

我的安装程序看起来像这样:

class WindsorInstaller : IWindsorInstaller
{
    void IWindsorInstaller.Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(...);

        //A little one-time test to try out the resolving of the service.
        //It would be removed as soon as it works.
        var service = container.Resolve<IService>("proxy-service");
    }
}

我的应用程序启动看起来像这样:

container = new WindsorContainer().Install(new WindsorInstaller());

因此在Resolve之前调用了Install。当然,一旦我将测试呼叫移至Resolve,以便在调用Install之后发生这种情况,一切正常。

答案 1 :(得分:0)

在我的情况下问题是我注册了IService但是尝试在顶级依赖项对象的构造函数中解析Service

public class MyController : Controller
{
    private readonly IService _service;

    public MyController(Service service) //problem here, Iservice should be used instead
    {
        _service = service;
    }
}