2009-03-08 2 views
1

Попытка использовать замок Windsor IoC. У меня очень простое приложение. Мои интерфейсы существуют в пространстве имен Test.Services. Я получаю следующее исключение при компиляции:Castle Windsor Не можете найти мой тип обслуживания

"Тип имя 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> 
Может кто-то

скажи мне, что мне не хватает?

Благодаря

-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

Выполнение следующих действий в коде, поскольку теперь у вас есть жесткая зависимость от всех сборок и компилятора, они гарантируют, что они доступны. Мой вопрос по-прежнему стоит - скопируйте файл Test.Services.dll в выходной каталог при использовании файла конфигурации? Обратите внимание, что компилятор не сделает этого для вас. –

0

Почти Ник! Вам необходимо пройти конфигурацию XML в конструктор WindsorContainer:

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

Я столкнулся с этим «Got уа», а когда я впервые начал играть с замок Виндзор. Он не знает, чтобы посмотреть в разделе конфигурации.

Совет. Пойдите, чтобы получить последний из их багажника. Существует новый метод Register, который действительно полезен для массового регистрации нескольких классов в одном и том же интерфейсе. I.e., если вы работаете с 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 («замок»))); Я пробовал это. Тот же вопрос. Я проверяю obviouse, и я не вижу опечаток. «Невозможно найти тип Test.Services.IParse» – 2009-03-08 22:07:02

+0

Не могли бы вы обновить свой вопрос с помощью фактического кода? Вы должны убедиться, что имена имен и имена сборок верны. – eduncan911

2

Глупый вопрос, но уверены ли вы, что сборка, содержащая класс, который вы регистрируете, фактически копируется в выходной каталог?

+0

Это не глупый вопрос. Это легко сделать, если у вас нет ссылки на сборку, содержащую вашу службу, тогда она не будет существовать в выходной папке. –

+0

Я знаю. Я просто убедился :) –

0

Является ли интерфейс IParse в сборке Test.Services (Test.Services.dll)?

Формат, используемый для определения имен типов в конфигурации, является тем же самым, что вы можете получить из свойства AssemblyQualifiedName этого типа. Вкратце, это:

Пространство имён.

Для общих типов см. this.

0

У меня была такая же проблема, и решение Эрика работало для решения проблемы. Я создал проект «Модели доменов», а затем переименовал его в «DomainModel». Хотя я изменил все ссылки, но затем, глядя в папку bin, сборка по-прежнему называлась «Domain Models», поэтому замок Windsor не смог его найти.

+0

Прохладный. :) (Имя сейчас eduncan911, а не Эрик) – eduncan911

 Смежные вопросы

  • Нет связанных вопросов^_^