ComponentNotFound исключение Castle.Windsor - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь начать работу с Castle.Windsor и после комментария, который я сделал по образцам, доступным в настоящее время для новичков (http://stw.castleproject.org/Windsor.Silvertlight_Sample_App_Customer_contact_manager.ashx?Discuss=1), Я подумал, что возьму быка за рога и обновлю приведенный здесь пример http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart1.aspx.

Это простое и довольно простое консольное приложение, использующее Castle Windsor, хотя и устаревшую версию. Мой метод Main в Program.cs выглядит следующим образом:

public static void Main()
    {
        IWindsorContainer container = new WindsorContainer();

        container.Install(FromAssembly.This());
        var retriever = container.Resolve<IHtmlTitleRetriever>();

        Console.WriteLine(retriever.GetTitle(new Uri(ConfigurationManager.AppSettings["fileUri"])));

        Console.Read();

        container.Dispose();
    }

иСервис и Компоненты, которые находятся в одном файле, то есть Program.cs, таким образом:

public interface IHtmlTitleRetriever
{
    string GetTitle(Uri file);

}

public interface IFileDownloader
{
    string Download(Uri file);
}

public interface ITitleScraper
{
    string Scrape(string fileContents);
}

public class HtmlTitleRetriever: IHtmlTitleRetriever
{
    private readonly IFileDownloader _downloader;
    private readonly ITitleScraper _scraper;

    public HtmlTitleRetriever(IFileDownloader dowloader, ITitleScraper scraper)
    {
        _downloader = dowloader;
        _scraper = scraper;
    }

    public string GetTitle(Uri file)
    {
        string fileContents = _downloader.Download(file);
        return _scraper.Scrape(fileContents);
    }
}



public class HttpFileDownloader : IFileDownloader
{
    public string Download(Uri file)
    {
        return new WebClient().DownloadString(file);
    }
}

public class StringParsingTitleScraper : ITitleScraper
{
    public string Scrape(string fileContents)
    {
        string title = string.Empty;
        int openingTagIndex = fileContents.IndexOf("<title>");
        int closingTagIndex = fileContents.IndexOf("</title>");

        if(openingTagIndex != -1 && closingTagIndex != -1)
            title = fileContents.Substring(openingTagIndex, closingTagIndex - openingTagIndex).Substring(7);

        return title;
    }
}

Это в значительной степени прямая копия того, что Симоне Бусоли имеет из своего примера. Код компилируется нормально, но яполучить следующую ошибку при запуске приложения:

Не найдено ни одного компонента для поддержки службы WindsorSample.IHtmlTitleRetriever

Я понимаю, что это значит, но я не знаючто я делаю неправильно, что компоненты не загружаются в контейнер. Я использую Castle.Windsor 2.5.2 и .NET 4.0.

С нетерпением жду ответов,

Дэвид

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Следуя совету Кшиштофа, приведу мой простой пример:

 public static void Main()
    {
        var container = new WindsorContainer();

       // container.Install(FromAssembly.This());
        container.Register(
            Component.For( typeof( IHtmlTitleRetriever ) ).ImplementedBy( typeof(HtmlTitleRetriever) ) ,
            Component.For( typeof( IFileDownloader ) ).ImplementedBy( typeof( HttpFileDownloader ) ),
            Component.For( typeof( ITitleScraper ) ).ImplementedBy( typeof( StringParsingTitleScraper ) )
         );
        var retriever = container.Resolve<IHtmlTitleRetriever>();

        Console.WriteLine(retriever.GetTitle(new Uri(ConfigurationManager.AppSettings["fileUri"])));

        Console.Read();

        container.Dispose();
    }

Это сработает.


Кшиштоф, мы тоже попробовали это

 container.Register(
            AllTypes.FromThisAssembly().Pick().If(Component.IsCastleComponent)
        );

и украсили все классы соответствующим образом, но я все еще получил ту же ошибку, что и раньше.Не могли бы вы пролить свет на это, пожалуйста?

0 голосов
/ 21 декабря 2010

Прежде всего - здорово, что вы обновляете образец.Как вы упомянули, еще меньший образец, без использования Silverlight, безусловно, будет полезен.

Что касается вашего вопроса - исключение означает, что запрошенная вами служба, IHtmlTitleRetriever, не поддерживается ни одним из зарегистрированных вами компонентов, вДругими словами - вы, кажется, вообще не зарегистрировали IHtmlTitleRetriever в контейнере.Как выглядит ваш установщик?Чтобы проверить, правильно ли зарегистрированы компоненты, вы можете поставить точку останова в строке после вызова Install и посмотреть, какие компоненты были зарегистрированы, и ожидали ли вы того.Это очень полезно для быстрой диагностики таких проблем, как та, что у вас есть.( см. Документацию здесь ).

Если вы все еще не уверены, в чем причина, убедитесь, что все ваши классы установщика общедоступны, и опубликуйте их код здесь, чтобы мы могливыяснить, в чем причина.

...