Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用NHibernate时,将用于查询的业务规则放在何处?_C#_.net_Asp.net_Asp.net Mvc_Nhibernate - Fatal编程技术网

C# 在使用NHibernate时,将用于查询的业务规则放在何处?

C# 在使用NHibernate时,将用于查询的业务规则放在何处?,c#,.net,asp.net,asp.net-mvc,nhibernate,C#,.net,Asp.net,Asp.net Mvc,Nhibernate,对NHibernate来说还是新鲜事。我正在使用NHibernate2.1.2和Linq提供程序 我想知道我应该把我的业务规则逻辑放在哪里。例如,我有一个名为带有DateTime属性的服务的实体。在我的web应用程序中,我只想显示或使用数据时间不到4周的服务。我应该把规则放在哪里 我开始构建一个ServiceRepository时使用了一个IEnumerable GetServices()方法,该方法封装了该逻辑,并认为“哦!每次我需要一个服务时,我都会使用该方法!” 当然,当我需要加载服务的子

对NHibernate来说还是新鲜事。我正在使用NHibernate2.1.2和Linq提供程序

我想知道我应该把我的业务规则逻辑放在哪里。例如,我有一个名为带有DateTime属性的服务的实体。在我的web应用程序中,我只想显示或使用数据时间不到4周的服务。我应该把规则放在哪里

我开始构建一个ServiceRepository时使用了一个IEnumerable GetServices()方法,该方法封装了该逻辑,并认为“哦!每次我需要一个服务时,我都会使用该方法!”

当然,当我需要加载服务的子对象时,就会出现问题。在查询数据库时,我不希望在我的存储库中有很多相同方法的排列。事实上,我真的根本不想使用存储库,因为我很努力地去注意,因为我对NHibernate还是个新手


我喜欢让对象指定我从数据库中需要什么,并且我可以在其中封装业务规则。我认为,它的linq部分让我感到厌烦。

您不需要额外的方法来“加载子对象”。您可以依靠关系和延迟加载来实现这一点


这样,您的原始设计就有效了。

看看法比奥·莫洛的设计。这展示了一种很好的封装NHibernate查询的方法,同时允许在如何实现查询方面具有很大的灵活性。

如果您在BLL中提到您的业务逻辑,那么您的项目结构必须如下所示:

  • BLL(业务逻辑层)。 它包含 接口, 服务, 模型

  • 动态链接库。 它包含 代表性, Nhibernate映射类

  • 3.网站。
    (添加BLL、DLL引用)

    有效,但可能无效。如果我提前知道我需要什么,我可以帮助NHibernate构建一个查询,而不是N+1查询。您可以避免N+1问题,而无需更改查询。例如,请参见。还有缓存等等。但是,当在我的视图(asp.net mvc)中访问子对象属性时,我遇到了会话已关闭的问题。这是因为您对会话的管理不正确。你应该在请求开始时打开它,在请求结束时关闭它。这正是我所做的。这不是问题所在。问题是,我将实体保留在多个请求中,当我稍后尝试访问它们时,它们会因为会话已关闭而生气。