Ich habe an einem System gearbeitet, in dem ich protobuf-net (Version 2.0.0.480) zur Serialisierung von Nachrichten verwende. Diese Anwendung verwendet einen CQRS-Ansatz, bei dem Befehle und Ereignisse in verschiedene Namespaces [und Assemblies] aufgeteilt wurden.
Der Code fügt die Typen dynamisch zur Laufzeit für jede Klasse hinzu, die von MessageBase erbt. Dies geschieht mit Hilfe des folgenden Codes:
// 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);
}
}
Einige Typen werden dem Default RuntimeTypeModel auch manuell hinzugefügt:
RuntimeTypeModel.Default.Add(typeof(ReferenceNumber), true)
.AddSubType(100, typeof(Product))
.AddSubType(110, typeof(ProductGroup));
All das scheint gut zu funktionieren, wenn alle Meldungen eingegangen sind:
LogicalGrouping.Events
Das Projekt kam voran und ein neuer Namensraum wurde hinzugefügt:
ReferenceGrouping.Commands
Sobald ReferenceGrouping.Commands wird hinzugefügt und versucht, eine Nachricht an ProtoException geworfen wird. Die einzige Abhilfe, die ich für dieses Verhalten gefunden habe, ist das Hinzufügen der Commands from ReferenceGrouping.Commands en LogicalGrouping.Events .
Ist dies das erwartete Verhalten oder sollte das RuntimeTypeModel in der Lage sein, Klassen zu unterstützen, die aus völlig unterschiedlichen Namensräumen hinzugefügt werden?