【问题标题】:NHibernate Traversal Question - Creating a Fluent InterfaceNHibernate 遍历问题 - 创建一个流畅的界面
【发布时间】:2010-11-01 01:43:30
【问题描述】:

我现在对 NHibernate 和我的领域模型感到困惑。我在脑海中想象着一个不错的 API,但我很难让它成为现实。这是我要完成的一个示例:

Trip trip = new Trip("Austria2009");

foreach(User user in trip.People.Crew.IsApproved())
{
    reponse.write(user.Firstname);
}

// Or I could hack some of the stuff off above and make it look like this
foreach(User user in trip.People.Crew)
{
    reponse.write(user.Firstname);
}

// Or yet again pull all the people back and forget a specific role
foreach(User user in trip.People)
{
    reponse.write(user.Firstname);
}

那么,Foreach 循环中的这些内容是否有意义? :P 我觉得我正在尝试用我的类创建某种流畅的界面。我正在使用 NHibernate 进行持久性,所以这样的事情是否可能,或者我只是需要让事情变得更简单吗?

【问题讨论】:

  • 请发布您的模型,以便我们查看关系

标签: c# nhibernate fluent traversal domain-model


【解决方案1】:

假设 Trip 是一个 IQueryable,使用 Linq 查询和扩展方法可以很容易地编写一个流畅的接口。注意:以下假设代码未经测试。

public static class MyExtensions
{
    public static IQueryable<Person> People(this IQueryable<Person> source)
    {
        return from person in source
               select person;
    }

    public static IQueryable<Person> Crew(this IQueryable<Person>  source)
    {
        return from person in source
               where person.type == crewMember
               select person;
    }
    public static IQueryable<Person> IsApproved(this IQueryable<Person>  source)
    {
        return from person in source
               where person.IsApproved == true
               select person;
    }
}

..等等。注意在每个方法的参数列表中使用“this”关键字。这允许通过点缀任何 IQueryable 源来调用该方法,如下所示:

var crew = myPersons.Crew();
var approvedCrew = myPersons.Crew().IsApproved();

注意:我认为没有办法使用这种技术消除括号。为此,您需要使用属性,而 C# 不支持“扩展属性”,仅支持“扩展方法”。

更多信息在这里:http://en.wikipedia.org/wiki/Fluent_interface

【讨论】:

  • 非常感谢!这正是我正在寻找的,但不知道该怎么称呼它。扩展!谢谢
猜你喜欢
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2022-08-19
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多