2009-03-08 9 views
1

Castle Windsor IoCを利用しようとしています。私は非常に単純なアプリケーションを持っています。私のインターフェイスはTest.Services名前空間に存在します。コンパイルするとき、私は次の例外を取得:Castle Windsor私のサービスタイプが見つかりません

<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> 

ことができる人:

"Test.Servicesが見つかりませんでした型名のTest.Services.IParseは"

これが私のapp.configをです私に何が欠けているか教えてください。コードの作品に次のことを行う

おかげ

-Nick

答えて

0
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>(); 

。私は毎回再コンパイルする必要はありませんので、Configファイルを使用したいと思います。

+0

次のコードを実行すると、すべてのアセンブリとコンパイラにハード依存関係があるため、それらにアクセスできるようになります。私の質問は依然として立っています - あなたはConfig.exec.dllを出力ディレクトリにコピーしますか?コンパイラはあなたのためにそれをしないことに注意してください。 –

0

ほぼニック!あなたはWindsorContainerのコンストラクタにxml設定を渡す必要があります:

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

私が最初に城ウィンザーで遊んで始めたとき、私は、同様にこの「ガット屋」に走りました。構成セクションを調べることは知られていません。

ヒント:トランクから最新のものを入手してください。 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) 
    )); 
    } 
} 
+0

IWindsorContainerコンテナ=新しいWindsorContainer(新しいXmlInterpreter(新しいConfigResource( "castle"))); 私はこれを試しました..同じ問題。私はobviouseをチェックしています、そして、私はタイプミスを見ません。 「タイプTest.Services.IParseが見つかりません」 –

+0

質問を実際のコードで更新できますか?名前空間とアセンブリ名が正しいことを確認する必要があります。 – eduncan911

2

愚かな質問ですが、あなたが登録したクラスを含むアセンブリが実際に出力ディレクトリにコピーされることは確かですか?

+0

それはまったく愚かな質問ではありません。簡単に行うことができます。サービスを含むアセンブリへの参照がない場合、出力フォルダーには存在しません。 –

+0

私は知っています。私はちょうど確信しているよ:) –

0

Test.Servicesアセンブリ(Test.Services.dll)のIParseインターフェイスはありますか。

設定でタイプ名を定義するために使用されるフォーマットは、タイプのAssemblyQualifiedNameプロパティから得られるものと同じです。一言で言えば、それは:

名前空間型、アセンブリ。

一般的なタイプについては、thisを参照してください。

0

私は同じ問題があり、問題を解決するためにEricのソリューションが機能しました。私は "Domain Models"プロジェクトを作成した後、 "DomainModel"に名前を変更しましたが、すべての参照を変更しましたが、binフォルダを調べても、アセンブリはまだ "Domain Models"と呼ばれていました。

+0

クール。 :)(名前はEricではなく、eduncan911になりました) – eduncan911

関連する問題