从我所看到/看到的有三种方法来定义protobuf的模型,使用.proto文件,使用类装饰和运行时调用来添加类型和字段。我正在寻找的是一种更像FluentNhibernate的方式,其中模型的定义被移除以单独地从程序中分离文件以使模型更清洁。在这一思路中,我创建了一个类Buffer<T>
,在实例化时将它定义的类添加到类型模型中。
public class CustomerBuffer : Buffer<Customer>
{
public CustomerBuffer()
{
Add("ID");
Add("SyncID");
Add("AccountNumber");
Add("Reference");
Add("Contact");
Add("Address");
Add("CreditInformation");
}
}
使用的类型模型在Buffer<T>
构造函数中创建,因此在调用派生类构造函数时可用。
当添加完所有内容后,我需要能够将模型合并在一起,以便进行编译。
到目前为止,我已经尝试过这个:
foreach(MetaType MT in model.GetTypes())
{
InternalModel.Add(MT.Type, false);
}
显然无效,因为它没有复制原始MetaType上的字段信息。
所以我正在寻找一个可以让我在一个程序集(或多个程序集)中搜索并添加从Buffer<T>
派生的所有类型到类型模型然后编译它的工作。
答案 0 :(得分:1)
通过对类型模型使用Singleton解决了这个问题。这样我就不需要合并类型模型,因为所有内容都添加到同一个模型中。是否需要向AddSubType添加覆盖,以便可以在没有类型编号的情况下调用它。这很好用。
<强>更新强>
这导致我到目前为止两个错误都基于所添加的类的初始化顺序。
“无法将类型x转换为类型y”在子类之后初始化基类时,在ProtoWriter和ProtoReader中发生。 - 这已经解决了,添加了一个排序算法来包装protobufcfg类,找到所有类型以初始化并实际初始化它们。
“检测到可能的递归”当包含属性列表的父项在子项和子项包含“父”属性后初始化时发生。
<强> UPDATE2 强>
这两个错误都是因为我滥用了AsReference属性,它需要是动态的,并且需要在子节点的“Parent”属性上引用,并且需要从列表中删除。
答案 1 :(得分:1)
看看Fluent protobuf-net:我认为它完全符合您的要求(例如,像Fluent NHibernate一样)。