在NHibernate中制作数据访问方法的最佳方法是什么?

Ser*_*lov 1 c# nhibernate static-methods data-access-layer

例如,我有两个类:Foo和Bar.这些类映射到一些表.

至于现在,我为每个类都有静态方法:Add,Update,Delete,Get.

E.g.: 

public class Foo
{
   private Guid _id;
   private string _someProperty;

   static Foo Get(Guid id);
   static void Add(Foo foo);
   static void Update(Foo foo);
   static void Delete(Foo foo);
}
Run Code Online (Sandbox Code Playgroud)

所以,当我需要用我的对象做smth时我会这样说:

Foo foo = Foo.Get(id);

Foo newfoo = new Foo();
Foo.Add(newfoo);

Foo.Update(newfoo);

Foo.Delete(newfoo);
Run Code Online (Sandbox Code Playgroud)

这是一个好方法吗?如果不是,我应该使用什么方法来访问数据?

谢谢

kit*_*une 8

你在做什么基本上是Active Record模式的实现.很多人使用它,这是一种非常有效的方法.但是,如果您的应用程序非常复杂,或者您对关注点分离感到迷恋,您可能会发现以下内容很有帮助:

我推荐DDD(域驱动设计)方法.DDD使用所谓的存储库模式.DDD将您的应用程序及其关注点分离到不同的层,"模型/域","基础架构"和"服务".

存储库是属于基础结构层的模式.像CustomerEmployer(MonsterWeapon)这样的业务对象位于模型层内,代表了"域"(您尝试建模)的核心,它们也负责业务逻辑.服务层可用于简化,编排跨多个模型的活动.

对于每个域模型(例如,您的类Foo和Bar),您有一个处理数据库访问的存储库.这样,您就可以进行数据库调用并将模型分开.

public interface IFooRepository
{
     Foo Get(Guid guid);
}

public class FooRepository : IFooRepository
{
     public Foo Get(Guid guid)
     {
         //... DB voodoo magic happening
         return foo;
     }
}
Run Code Online (Sandbox Code Playgroud)

IRepository<T>如果您厌倦了一直为您的存储库编写锅炉代码,您也可以创建一个通用的.

您还应该研究依赖注入/控制反转,因为这种方法非常适用于它.

这种方法的好处是,您可以轻松实现从IFooRepository派生的新类.这使您可以快速采用数据库基础结构中的更改.例如,你可以创建一个FooRepository从一个XML文件,或者一个从一个Postgres数据库与NHibernate读取读取数据.

您还可以阅读本文,本文和有关DDD的这篇文章.