Я работал над системой, в которой я использую protobuf-net (версия 2.0.0.480) для сериализации сообщений.Это приложение использует подход CQRS, в котором команды и события были разделены на разные пространства имен [и сборки].
Код будет динамически добавлять типы во время выполнения для любого класса, который наследуется от MessageBase.Это делается с помощью приведенного ниже кода:
// Used as a unique reference for each type in a member
private static int _sequence = 1000;
public static void RegisterAll()
{
RegisterAllDerivedFrom<MessageBase>();
}
public static void RegisterAllDerivedFrom<T>(params Assembly[] assemblies)
{
if (assemblies == null || assemblies.Length == 0)
{
assemblies = AppDomain.CurrentDomain.GetAssemblies();
}
var type = typeof(T);
var model = RuntimeTypeModel.Default;
var metaModel = model.Add(type, true);
RegisterAllBaseTypes(type, metaModel, model, assemblies);
}
private static void RegisterAllBaseTypes(Type type, MetaType metaModel, RuntimeTypeModel model, params Assembly[] assemblies)
{
foreach (var t in assemblies.SelectMany(a => a.GetTypes().Where(t => t.BaseType != null && t.BaseType == type)))
{
var subModel = model.Add(t, true);
metaModel.AddSubType(_sequence, t);
_sequence++;
RegisterAllBaseTypes(t, subModel, model, assemblies);
}
}
Несколько типов добавляются вручную в Default RuntimeTypeModel, а также:
RuntimeTypeModel.Default.Add(typeof(ReferenceNumber), true)
.AddSubType(100, typeof(Product))
.AddSubType(110, typeof(ProductGroup));
Все вышеперечисленное работает нормально, когда все сообщения былив:
LogicalGrouping.Events
Проект перемещен вперед и добавлено новое пространство имен:
ReferenceGrouping.Commands
Как только ReferenceGrouping.Commands добавляется и пытается отправить сообщение, ProtoException выбрасывается.Единственный обходной путь, который я нашел для этого поведения, состоит в добавлении команд из ReferenceGrouping.Commands в LogicalGrouping.Events .
Это ожидаемое поведение или должно RuntimeTypeModelбыть в состоянии поддерживать классы, добавляемые из совершенно разных пространств имен?