NHibernate - 检索数据库条目后执行步骤
NHibernate - Perform step after retrieving database entry
我有一个 class,其中附加了一些元数据。例如:
public class Parameter<T> : IParameter
{
public string Id { get; set; }
public T Value { get; set; }
public List<IParameter> Metadata { get; set; }
}
我有另一个 class 然后包含一个 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
是大型 class 层次结构的一部分。当我检索拥有的 class.
时,NHibernate 自动检索 Bar
作为连接的一部分
Bar
可以执行 "deserialization" 步骤也很重要,因为其他 class 使用 Parameter<T>
class 并可能填充元数据从不同的地方到 Bar
.
我正在考虑使用 IUserType
来加载 NullSafeGet
中的元数据,但是 GetMetadata
依赖于 Bar
的另一个 属性 并且我不知道如何在所有必要的地方获得那个价值。
简而言之:NHibernate/FluentNHibernate中有没有类似于[OnDeserialized]
的东西?
我想 event listeners (more specifically, IPostLoadEventListener
) 就是你想要的。
我有一个 class,其中附加了一些元数据。例如:
public class Parameter<T> : IParameter
{
public string Id { get; set; }
public T Value { get; set; }
public List<IParameter> Metadata { get; set; }
}
我有另一个 class 然后包含一个 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
是大型 class 层次结构的一部分。当我检索拥有的 class.
Bar
作为连接的一部分
Bar
可以执行 "deserialization" 步骤也很重要,因为其他 class 使用 Parameter<T>
class 并可能填充元数据从不同的地方到 Bar
.
我正在考虑使用 IUserType
来加载 NullSafeGet
中的元数据,但是 GetMetadata
依赖于 Bar
的另一个 属性 并且我不知道如何在所有必要的地方获得那个价值。
简而言之:NHibernate/FluentNHibernate中有没有类似于[OnDeserialized]
的东西?
我想 event listeners (more specifically, IPostLoadEventListener
) 就是你想要的。