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) 就是你想要的。