我有一个附加了一些元数据的类。例如:
public class Parameter<T> : IParameter
{
public string Id { get; set; }
public T Value { get; set; }
public List<IParameter> Metadata { get; set; }
}
我有另一个类,然后包含IList<IParameter>
public class Bar
{
public IList<IParameter> Parameters { get; set; }
}
我有IUserType
可以将某些类型存储为JSON(例如List<IParameter>
)。我计划使用此存储Bar.Parameters
,因此列值如下所示:
[
{
"id": "letter",
"value": "a",
"metadata": [
"options": [ "a", "b", "c" ]
]
},
{
"id": "cat.name",
"value": "Mittens",
"metadata": [
"display_name": "Name"
]
}
]
然而,我没有必要存储元数据,因为它在别处定义,可以使用Parameter.Id
检索。我想改为存储一个映射其值的id数组:
[
"letter": "a",
"cat.name": "Mittens"
]
我知道如何以这种方式编写Parameters
列,但我不确定如何在检索到元数据后让Bar
检索元数据。
理想的是类似于WCF中的OnDeserialized
属性。这允许我在Bar
上定义一个方法,该方法在反序列化后调用:
public class Bar
{
public string Type { get; set; }
public IList<IParameter> Parameters { get; set; }
[OnDeserialized]
private void OnDeserialized(StreamingContext ctx)
{
// Extremely simplified example of how the Foo metadata may
// be retrieved.
foreach(var parameter in Parameters)
{
parameter.Metadata = BarMetadataStore.GetMetadata(Type, parameter.Id);
}
}
}
我想避免在Bar
上手动调用函数来检索元数据,因为我的真实Bar
是大类层次结构的一部分。当我检索拥有类时,NHibernate会自动检索Bar
作为连接的一部分。
Bar
执行“反序列化”步骤也很重要,因为其他类使用Parameter<T>
类,可能会将元数据从不同的地方填充到Bar
。
我正在考虑使用IUserType
加载NullSafeGet
中的元数据,但GetMetadata
依赖于Bar
的另一个属性,我不知道如何在所有必要的地方获得这个价值。
简而言之:NHibernate / FluentNHibernate中有类似于[OnDeserialized]
的内容吗?