0

我想允许第 3 方代码在运行时扩展 NHibernate 映射。这就是我现在所拥有的:

数据:

TABLE Orders
    Id INT identity,
    [more fields...]

我项目中的代码:

public interface IOrder
{
    int Id { get; set; }
    // more properties...
}

internal class Order : IOrder
{
    public int Id { get; set; }
}

public class OrderDAL
{
    public IEnumerable<IOrder> GetOrders()
    {
        ICriteria criteria;
        // build some criteria
        var result = criteria.List<Order>();
        RaiseOrdersLoaded(result);
        return result;
    }
}

NHibernate hbm 文件:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="..." assembly="...">
  <class name="Order" table="Orders">
    <id name="Id" column="Id" type="int" >
      <generator class="identity" />
    </id>
    [more properties...]
  </class>
</hibernate-mapping>

第 3 方是我用 Ioc 加载的 dll。它知道接口IOrder但不知道Order类。它的开发人员还在我的数据库中添加了一个表:

TABLE OrderExtension
    OrderId PK, FK from Orders
    CustomField nvarchar

现在第 3 方开发者应该能够做到:

  1. 将他添加CustomField到查询中GetOrders。我想过在运行时扩展 hbm 文件,但我不知道如何。
  2. 将条件添加到查询中以按 his 过滤CustomField
  3. 监听OrdersLoaded事件并以某种方式获取他的数据。

这一切可能吗?

谢谢

4

1 回答 1

1

您可以将命名查询放入映射中,但这些将在 SQL 中:http: //nhibernate.info/doc/nh/en/index.html#querysql-namedqueries

您还可以在映射中定义过滤器,这些过滤器将被注入到其他类型的查询中:http: //nhibernate.info/doc/nh/en/index.html#filters

至于 Criteria、Queryover、HQL 和 LINQ 查询,您可以在 Orders 类中构建您喜欢的任何构造,以便通过插件可以调用的一些初始化方法进行配置。

于 2013-01-02T10:54:09.533 回答