2009-11-03 20 views
6

Kafam karıştı. Bu Ayende Rahien Repository is the new singleton bir blog girişi.NHibernate ile DDD Havuzları deseni

Bir deponun yalnızca CRUD işlemleri yapması ve ek sorgulama yapmamaları gerektiğine inanıyorum, aksi takdirde deponuzdaki yöntemler gibi bir yöntemle sonuçlanacaksınız.

  1. FindCustomer (id)
  2. FindCustomerWithAddresses (id)
  3. FindCustomerWith ..

Benim soru, (Ne katman olarak) bir varlıkları almak için sorguları yapacağını edilir?

+0

Konuyla ilgili iki yararlı mesaj: [Jimmy Bogard] (http://www.lostechies.com/blogs/jimmy_bogard /archive/2009/09/02/ddd-repository-implementation-patterns.aspx) ve [Greg Young] tarafından (http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the- jenerik-repository.aspx). Karma bir yaklaşıma yöneliyorum: basit eylemler için genel depolar ve daha karmaşık olanlar için sorgu nesneleri. Genellikle depolarımı mantığımı (UI, hizmet) kullanan herhangi bir şeye maruz bırakmam fakat hizmet/cepheye benzer bir modelde işlevsellik sunmam, bu yüzden ikili yaklaşım bu cephe tabakasının dışına çıkmıyor. – tijmenvdk

cevap

3

Varsayılan CRUD işlemlerine sahip depo yazmak mümkündür. Örneğin:

public interface IRepository<TEntity> 
{ 
    TEntity FindByIdentity(object identity); 
    TEntity FindBy(Expression<Func<TEntity, bool>> specification); 
    IList<TEntity> FindAll(); 
    IList<TEntity> FindAllBy(Expression<Func<TEntity, bool>> specification); 
    TEntity Save(TEntity saveable); 
    void Delete(TEntity deletable); 
} 

İfade> temelde Şartname ve sorgular bu şekilde saklanması olabilir. Eğer bu tür Deposu varsa, birçok özel depoya yazmamız gerekmez.

Alternatif yol, Sorgu nesnesini oluşturur. Bu sorgunun arayüzünü Core/Busines Logic katmanına ekleyebilir ve Services/Data katmanına uygulayabiliriz. Bu şekilde, AllPreferredCustomersQuery gibi güzel adlandırılmış sorgularımız var. Teknik özelliklere oldukça benziyor, ancak özellikler altyapı kullanmıyor ve bu nedenle Core/Business Logic katmanına ekleyebiliriz. Query nesneler daha fazla yapılandırılabilir (örneğin, limit eklemek, stratejileri eklemek, birleştirmek vb.)