2010-08-23 3 views
0

У меня есть следующий класс: public class MainView : IHandle<MessageOne>,
IHandle<MessageTwo>...
Замок Виндзор Fluent Registration Problem

Я хотел бы, чтобы зарегистрировать все классы, реализующие по крайней мере один закрытый вариант IHandle <> Интерфейс с беглого регистрации замок Виндзор, но это не делает Работа. BasedOn (typeof (IHandleThe <>)) не выбирает правильные типы. Я использую следующее заявление:

container.Register(AllTypes 
        .FromAssemblyNamed("MyAssembly") 
        //.If(t => t.Name.EndsWith("View") 
        .BasedOn(typeof(IHandleThe<>)) 
        .Configure(registration => DoStuff()) 
        .WithService.Base); 

Приведенный выше код не попадает в Configure вызова, но когда я комментирую строку BasedOn и раскомментировать строку If, то он работает. Однако, если это не слишком полезно. Кто-нибудь знает, что я делаю неправильно.

Любые идеи/помощь оценили

наилучшими пожеланиями Gope

ответ

0

Это одна из менее интуитивным вещей о API. Если вы посмотрите at the documentation, вы обнаружите, что PickBasedOn и Where делать XOR, поэтому код выше будет регистрировать два набора типов:

  1. типов, которые имеют имя, оканчивающийся «View» (с по умолчанию connfiguration , то есть в качестве themseles)

  2. Типы, которые основаны на IHandleThe<> (все они найдены в сборке, предыдущее условие здесь не применимо) и настроить их на базовую службу и независимо от того, что делает метод DoStuff.

Чтобы достичь того, чего вы хотите (в зависимости от типа и если имя заканчивается если) BasedOn вызов должен пройти первый, все остальные должны идти за ним.

+0

Привет, Krzysztof и спасибо за помощь, дело в том, что только basedOn() не работает. Строка If-Line предназначена только для Stackoverflow, чтобы показать людям, что версия BasedOn не работает, но использует if без функции BasedOn. Просто, чтобы доказать, что это не слишком глупая ошибка, как сборка не существует. Мне нужны только типы, реализующие IHandleThe <>. Ничего с таким именем, как «Вид». Но я понимаю, что вы ожидаете, что приведенный выше код будет работать так, как есть (с прокомментированной или удаленной if-строкой). Любая другая идея, что может быть причиной? – Gope

+0

ok, в какой версии вы используете? Вы уверены, что существуют какие-либо типы, реализующие 'IHandlerThe <>' в этой сборке? Я написал такой код на нескольких проектах - он ** должен работать ** –

+0

Yup, IHandleThe <> реализуется одним классом (MainView), а часть configure использует этот тип, который работает с линией if , Так что это не проблема, но возможно версия? The Castle.Windsor.dll имеет версию 2.1.0.6655. Я скопировал это из демонстрации друзей Rhino-ESB. Могут ли быть проблемы с 64/32 бит материалами в сборках Castle? Я только что нашел, что у 2 из моих 4 проектов есть тип сборки x86, а другие (без ссылок на внешние сборки) находятся на anyCPU ... странно ... кстати, все это на .NET 4.0 – Gope

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