2010-01-15 18 views
13

NHibernate kullanarak bir havuz düzeni var. taban sınıfı şuna benzer:İş birimi ve havuz kalıbı

public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
    void Rollback(); 
} 

// generic NHibernate implementation of IUnitOfWork here 

public class NHibernateRepositoryBase<T> : IRepository<T> 
{ 
    private NHibernateUnitOfWork _unitOfWork; 

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
    public T Get(object id) 
    { 
     return _unitOfWork.Session.Get<T>(id); 
    } 

    // ... 
} 

Gördüğünüz gibi, ben işin birimi (StructureMap kullanarak) yapıcısı aracılığıyla doldurulur izin ediyorum. Öyle gibi benim ASP.NET web hizmetleri üzerinde depo nesneleri doldurma ediyorum:

sen anlamak mümkün olabilir gibi
[WebService(Namespace = "...")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class ModuleService : System.Web.Services.WebService 
{ 
    public IUserAccountRepository UserAccountRepo { get; set; } 

    public ModuleService() 
    { 
     // tell IoC to inject properties 
     ObjectFactory.BuildUp(this); 
    } 

    // ... 
} 

, sorunum tasarım yoluyla, şimdi yaşam döngüsünün kontrolünü kaybettim olmasıdır iş biriminin Daha önce, ben işin birimi bir bağlam duyarlı nesne yapılmış ve depo gibi bir şey aracılığı başvurusu elde ediyorum:

public class NHibernateRepositoryBase<T> : IRepository<T> 
{ 
    public T Get(object id) 
    { 
     return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id); 
    } 

    // ... 
} 

Bu, bir önceki tasarım benim kodunda işin birimin yaşam döngüsünü kontrol etmeye izin Bir birim ifadesi kullanarak bir UnitOfWorkFactory iş birimi oluşturarak. İşi daha çok IoC konteynerinin elinde tutmaya çalışıyordum ama sanırım geriye doğru bir adım attım. Uygulamada ne düşünüyorsunuz?

cevap

3

IoC kabınızın mümkün olduğunca işlenmesine izin vermek genellikle iyi bir şeydir. Web'de, bir iş deseni birimi genellikle isteğin başlangıcında başlatılır ve sonunda işlenir (herhangi bir istisna varsa geri alınır). Bu sayede deponuzun yerine otorite yerine bir İdare verilecektir. Bu şekilde, deponuzun taahhüt veya herhangi bir şeyle uğraşması gerekmeyecek ve sizin için otomatik olarak ele alınacaktır.

+0

Bu tür kurulumlarda bireysel işlemleri nasıl yapıyorsunuz? Aynı oturumda iki ayrı kod kümesini çalıştırmam gerektiğini ve her birinin kendi işlemi olduğunu varsayalım. Bunu nasıl ele almayı önerirsiniz? – Chris

+0

İşlemler oturum boyunca ele alınır. Başka bir şeye ihtiyacınız yoktur, daha sonra bir işlem kullanmak için oturum referansı. –

+3

NHibernate oturumu temelde kendi içinde bir iş birimidir. Kendi iş birimi arayüzünüzün arkasına gizlemenin nedeni, temel olarak, uygulamanın geri kalanına (deponuzun dışında) genel bir şekilde maruz kalabilmeniz ve NHibernate'e bağlı olmamanızdır. Ve bu çoğunlukla, sadece isteğin başlangıcında başlatmak ve sonunda da taahhüt etmek olacaktır. –

İlgili konular