2010-11-05 19 views
5

aşağıdaki mimarisine dayanan bir MVC web uygulaması varAsp.Net MVC UNitOfWork ve MySQL ve Uyku Bağlantıları

iş modelinin bir birim kullanır Asp.Net MVC2, Ninject, Akıcı NHibernate, MySQL.

Her bağlantı MySQL, SHOW PROCESSLIST sorgu sonuçlarında bir girdi olarak görülebilen bir uyku bağlantısı oluşturur.

Sonuç olarak, bu uygulama havuz sınırını aşmak ve web uygulamasını kilitlemek için yeterli bağlantılar oluşturacaktır.

Bağlantıların doğru şekilde atılmadığından şüpheleniyorum.

Bu nerede ve nasıl gerçekleşmeli?

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly ISessionFactory _sessionFactory; 
    private readonly ITransaction _transaction; 
    public ISession Session { get; private set; } 

    public UnitOfWork(ISessionFactory sessionFactory) 
    { 
     _sessionFactory = sessionFactory; 
     Session = _sessionFactory.OpenSession(); 
     Session.FlushMode = FlushMode.Auto; 
     _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted); 
    } 

    public void Dispose() 
    { 
     if (Session != null) 
     { 
      if (Session.IsOpen) 
      { 
       Session.Close(); 
       Session = null; 
      } 
     } 
    } 

    public void Commit() 
    { 
     if (!_transaction.IsActive) 
     { 
      throw new InvalidOperationException("No active transation"); 
     } 
     _transaction.Commit(); 
     Dispose(); 
    } 

    public void Rollback() 
    { 
     if (_transaction.IsActive) 
     { 
      _transaction.Rollback(); 
     } 
    } 
} 




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




public class DataService 
{ 
    int WebsiteId = Convert.ToInt32(ConfigurationManager.AppSettings["Id"]); 

    private readonly IKeyedRepository<int, Page> pageRepository; 
    private readonly IUnitOfWork unitOfWork; 

    public PageService Pages { get; private set; } 


    public DataService(IKeyedRepository<int, Page> pageRepository, 
     IUnitOfWork unitOfWork) 
    { 
     this.pageRepository = pageRepository; 
     this.unitOfWork = unitOfWork; 

     Pages = new PageService(pageRepository); 

    } 

    public void Commit() 
    { 
     unitOfWork.Commit(); 
    } 

} 


public class PageService 
{ 
    private readonly IKeyedRepository<int, Page> _pageRepository; 
    private readonly PageValidator _pageValidation; 

    public PageService(IKeyedRepository<int, Page> pageRepository) 
    { 
     _pageRepository = pageRepository; 
     _pageValidation = new PageValidator(pageRepository); 
    } 

    public IList<Page> All() 
    { 
     return _pageRepository.All().ToList(); 
    } 

    public Page FindBy(int id) 
    { 
     return _pageRepository.FindBy(id); 
    } 
} 

cevap

3

Gönderiniz, UoW'ların hangi kapsamda oluşturulduğu konusunda herhangi bir bilgi vermez.

Geçici ise. Hiç bertaraf edilmeyecek ve bu size kalmış.

InRequestScope durumunda, GC HttpContext'i topladıktan sonra atılacaktır. Ancak Bob'a son zamanlarda Ninject Mailing List numaralı telefondan söylediğim gibi, HttpApplication'ın son istek olay işleyicisindeki tüm nesneleri serbest bırakmak mümkündür. Ninject'in bir sonraki sürümünde bunun için destek ekleyeceğim.

+0

mükemmel blog.bobcravens.com Bob Cravens ile temas halinde kim kendim ve ben şimdi EndRequest + = temsilci { IUnitOfWork UOW = Kernel.Get () kullanıyorum; uow.Dispose(); }; –

0

Ninject sizin IDisposable s Dispose d olacak ne zaman ve nerede hakkında hiçbir garanti vermez: Burada

kullanıyorum kod anlık görüntüsüdür.

Ben de buralarda bir göz olması öneririm bu post from the original Ninject man

, bu çeşitli kalıcılık mekanizmalarının ve çeşitli kaplar için geldi oku - çektiğinizi yaparken anahtar şey kontrol altına almak ve bilmek gerekir edilir UOW'un taahhüt/geri alma/imha semantiği içinde ve şansa ya da tesadüflere (Sözleşme muhteşem olsa da) bırakmayın.