【问题标题】:Castle Windsor Cannot find my Service Type温莎城堡找不到我的服务类型
【发布时间】:2026-01-28 08:10:02
【问题描述】:

试图利用 Castle Windsor IoC。我有一个非常简单的应用程序。我的接口存在于 Test.Services 命名空间中。编译时出现以下异常:

“类型名Test.Services.IParse,找不到Test.Services”

这是我的 app.config:

<configuration>
  <configSections>
    <section name="castle"
      type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,    
      Castle.Windsor" />


   </configSections>

  <castle>
    <components>
      <component id="HtmlTitleRetriever"
                 type="Test.HTMLTitleRetriever, Test">
      </component>
      <component id="FileParser"
                 service="Test.Services.IParse, Test.Services"
                 type="Test.FileParser,   
                      Test">
      </component>
      <component id="FileDownloader"
                 service="Test.Services.IDownload, Test.Services"
                 type="Test.FileDownloader, Test">
      </component>
    </components>
  </castle>

谁能告诉我我错过了什么?

谢谢

-尼克

【问题讨论】:

    标签: c# inversion-of-control castle-windsor


    【解决方案1】:

    愚蠢的问题,但是您确定包含您注册的类的程序集实际上被复制到了输出目录吗?

    【讨论】:

    • 这根本不是一个愚蠢的问题。它可以很容易地完成,如果您没有对包含您的服务的程序集的引用,那么它就不会存在于输出文件夹中。
    • 我知道。我只是确保:)
    【解决方案2】:
    IWindsorContainer container = new WindsorContainer();
    
            container.AddComponent("FileDownlader", typeof(IDownload),
                 typeof(FileDownloader));
            container.AddComponent("FileParser", typeof(IParse),
                 typeof(FileParser));
            container.AddComponent("HTMLTitleRetriever", typeof(HTMLTitleRetriever));
    
            HTMLTitleRetriever retriever = container.Resolve<HTMLTitleRetriever>();
    

    在代码中执行以下操作。我想使用一个配置文件,所以不需要每次都重新编译。

    【讨论】:

    • 在代码中执行以下操作是可行的,因为现在您对所有程序集都有硬依赖,并且编译器确保它们可访问。我的问题仍然存在 - 使用配置文件时是否将 Test.Services.dll 复制到输出目录?请注意,编译器不会为您执行此操作。
    【解决方案3】:

    几乎是尼克!需要将xml配置传入WindsorContainer的构造函数中:

    IWindsorContainer container;
    container =
      new WindsorContainer(
        new XmlInterpreter(
          new ConfigResource("castle")
      ));
    

    当我第一次开始玩 Castle Windsor 时,我也遇到了这个“Got ya”。它不知道查看配置部分。

    提示:从他们的后备箱中获取最新信息。有一个名为 Register 的新方法对于在同一个接口上批量注册多个类非常有用。即,如果您正在使用 ASP.NET MVC 进行开发,并且您有一堆 IController,您可以使用 Castle Windsor 为您自动注册它们。因此,您不必在配置文件中指定它们!

    public class WindsorControllerFactory : IControllerFactor
    {
      IWindsorContainer container;
      public WindsorControllerFactory()
      {
        container =
          new WindsorContainer(
            new XmlInterpreter(
              new ConfigResource("castleWindsor")
          ));
    
        container.Register(
          AllTypes.Of<IController>()
          .FromAssembly(Assembly.GetExecutingAssembly())
          .Configure(component => component.LifeStyle.Transient
            .Named(component.Implementation.Name)
          ));
      }
    }
    

    【讨论】:

    • IWindsorContainer container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));我试过这个..同样的问题。我正在检查明显的,我没有看到任何错别字。 "找不到类型 Test.Services.IParse"
    • 你能用实际代码更新你的问题吗?你必须确保你的命名空间和程序集名称是正确的。
    【解决方案4】:

    Test.Services 程序集 (Test.Services.dll) 中是否有 IParse 接口?

    用于在配置中定义类型名称的格式与您可以从该类型的 AssemblyQualifiedName 属性中获得的格式相同。简而言之就是:

    命名空间.类型,程序集。

    对于泛型类型,请参阅this

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,Eric 的解决方案有效地解决了这个问题。我创建了一个“域模型”项目,然后将其重命名为“域模型”,尽管我更改了所有引用,但随后查看 bin 文件夹,该程序集仍被称为“域模型”,这就是温莎城堡找不到它的原因。

      【讨论】:

      • 酷。 :)(现在的名字是 eduncan911,不是 Eric)
      最近更新 更多