По разным причинам я пытаюсь обновить проект со старой версии 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 ? ).
Может кто-нибудь сказать мне, если я делаю что-то не так, или это действительно ошибка?