Исключение «элемент с таким же ключом уже добавлен» для удаленного универсального компонента - PullRequest
3 голосов
/ 03 февраля 2012

По разным причинам я пытаюсь обновить проект со старой версии Castle до версии 2.5.3 (я не могу перейти на v3 из-за критических изменений) и столкнулся с проблемой с общим компонентом, который удален:

   Container.Register(Component.For(typeof(IStore<>))
        .Named("GenericStore")
        .AddAttributeDescriptor("remoteserver", "RecoverableComponent")
        .AddAttributeDescriptor("marshalByRefProxy", "true")
        .ImplementedBy(typeof(MyStore<>)));

Компонент, кажется, регистрируется нормально, но в момент, когда я пытаюсь решить:

   Container.Resolve<IStore<Users>>()

Я получаю исключение "элемент с тем же ключом уже добавлен" и трассировка стека (сокращенная):

at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary`2.System.Collections.IDictionary.Add(Object key, Object value)
at Castle.Facilities.Remoting.RemotingInspector.ConfigureServerComponent(RemotingStrategy server, Type type, ComponentModel model)
at Castle.Facilities.Remoting.RemotingInspector.ProcessModel(IKernel kernel, ComponentModel model)
at Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.BuildModel(String key, Type service, Type classType, IDictionary extendedProperties)
at Castle.MicroKernel.Handlers.DefaultGenericHandler.GetSubHandler(CreationContext context, Type genericType)
at Castle.MicroKernel.Handlers.DefaultGenericHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired)
at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context, Boolean instanceRequired)
at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)

Как видно из трассировки стека, она, похоже, снова "строит модель" (вызов DefaultComponentModelBuilder).

Я неправильно регистрирую свой компонент?

Я скачал часть исходного кода, чтобы попытаться выяснить, что я делаю неправильно, но интересно, не является ли это на самом деле проблемой, вызванной сочетанием Generic и Remoting?

Исключение вызвано Castle.Facilities.Remoting.RemotingInspector , пытающимся добавить свойства в словарь ExtendedProperties, которые уже существуют. В Castle.MicroKernel.Handlers.DefaultGenericHander кажется, что он не обнаруживает тот факт, что модель уже существует (это я или ничего не добавлено в словарь type2SubHandler ? ).

Может кто-нибудь сказать мне, если я делаю что-то не так, или это действительно ошибка?

1 Ответ

3 голосов
/ 15 августа 2014

Мое скромное предположение, что это не проблема с Виндзорским замком.Возможно, у вас есть статический словарь, определенный в компоненте, который Castle Windsor пытается определить, какой словарь (или другая коллекция с уникальным ограничением ключа) имеет дублирующийся ключ.Вероятно, из операции копирования-вставки.Вы получите эту ошибку, если попытаетесь создать экземпляр класса вручную.Код может выглядеть так:

public class MissTypedDictionaryClass
{
... some ctors here
... some other methods and props

... and somewhere here lies the mistyped dict
    private static readonly Dictionary<string, string> MyDeclaredDict = new Dictionary<string, string>()
    {
        {"Key1", "Val1"},
        {"Key2", "Val2"},
        {"Key1", "Val3"}, // Here is the problem.
    };
 }
...