2013-05-29 3 views
4

жаль, если это было предложено, прежде чем я пытался делать некоторые Google-джеинга и не нашли никаких совпадений, так что здесь идет ....Предотвращение повторяющихся регистраций - Виндзорский замок

У меня есть контейнер замок Виндзор, что Я добавлю свои компоненты, используя следующий метод (где контейнер является экземпляром IWindsorContainer) ...

container.Register(AllTypes.FromAssemblyNamed("App.Infrastructure") 
    .Where(x => !x.IsAbstract && !x.IsInterface) 
    .WithService.DefaultInterface() 

Это прекрасно работает, но я тогда хочу зарегистрировать другой DLL в том же образом разрешить зависимости от этого. ..

Теперь все равно я могу заставить Windsor уведомить меня, если добавляется одно и то же разрешение интерфейса, т. Е. Есть только один исполнитель на интерфейс (возьмите первый, если более одного существует).

Надеюсь, я достаточно хорошо объяснил. Я использую версию Castle Windsor: 2.5.1.0 и обновление/изменение версии на самом деле не являются опциями.


Update:

Я решить это путем удаления дубликатов регистрации после того, как они были зарегистрированы. После завершения регистрации, то у меня есть ниже петля ...

var registeredServices = new Dictionary<Type, string>(); 
foreach (var node in container.Kernel.GraphNodes) 
{ 
    var cmp = ((Castle.Core.ComponentModel)node); 
    Type t = cmp.Service; 
    if (registeredServices.ContainsKey(t)) 
     container.Kernel.RemoveComponent(cmp.Name); 
    else 
     registeredServices.Add(t, cmp.Implementation.FullName); 
} 
+0

Это должно быть поведение по умолчанию, когда первая регистрация разрешена. – maxlego

+0

Привет @maxlego. Я не понимаю, что вы имеете в виду, не могли бы вы рассказать о том, что вы имеете в виду. –

+1

, если вы зарегистрируете несколько компонентов с одним и тем же интерфейсом. то при разрешении этого интерфейса вы получите первый зарегистрированный компонент. Как я понимаю, это то, что вы хотите. Или это не так? – maxlego

ответ

6

я не знаю, если вы можете настроить регистратор бросить исключение, но эта простой фрагмент кода может помочь вам

var registeredServices = new List<Type>(); 

foreach (var node in container.Kernel.GraphNodes) 
{ 
    foreach (var t in ((Castle.Core.ComponentModel)node).Services) 
    { 
     if (registeredServices.Contains(t)) 
      throw new Exception(string.Format("service {0} already registered", t)); 
     registeredServices.Add(t); 
    } 
} 
4

В 2.5 вы можете после регистрации все, звоните

var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object)); 

, то вы можете посмотреть на каждом обработчик .Service и найти, если есть какие-либо дубликаты, и eith er бросить полезное исключение или что-то в этом роде.

Я бы предположил, что это то, что вы хотите сделать в тесте, а не во время выполнения.

+0

typo there - container.Kernet:} – maxlego

+0

Спасибо Krzysztof, Это именно то положение, в котором я пытаюсь выполнить чек. У нас есть единичный тест, который ищет дубликаты регистраций, которые терпят неудачу, и я надеялся найти способ обнаружить что дублируется. Спасибо, ребята, попробуют как ваши решения, так и отчитают мои результаты! –

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