Замок Виндзор Не могу найти мой тип обслуживания - PullRequest
1 голос
/ 09 марта 2009

Попытка использовать Замок Виндзор 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>

Может кто-нибудь сказать мне, что мне не хватает?

Спасибо

-Nick

Ответы [ 5 ]

2 голосов
/ 09 марта 2009

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

0 голосов
/ 29 июля 2009

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

0 голосов
/ 10 марта 2009

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

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

Namespace.Type, Assembly.

Общие типы см. this .

0 голосов
/ 09 марта 2009

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

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

Я столкнулся с этим "Got ya", когда впервые начал играть с Castle Windsor. Не знает заглянуть в раздел конфигурации.

Совет: иди, возьми последнюю из своего сундука. Есть новый метод 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 голосов
/ 09 марта 2009
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>();

Выполнение следующих действий в коде работает. Я хотел бы использовать файл конфигурации, хотя изменения не нужно перекомпилировать каждый раз.

...