Nic*_*ray 5 mysql asp.net-mvc ninject unit-of-work fluent-nhibernate
我有一个基于以下架构的MVC Web应用程序
Asp.Net MVC2,Ninject,Fluent NHibernate,MySQL使用单位工作模式.
与MySQL的每个连接都会生成一个睡眠连接,可以将其视为SHOW PROCESSLIST查询结果中的一个条目.
最终,这将产生足够的连接来执行应用程序池限制并使Web应用程序崩溃.
我怀疑连接没有正确处理.
如果是这种情况,应该如何发生?
这是我正在使用的代码的快照:
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);
    }
}
Run Code Online (Sandbox Code Playgroud)
    您的帖子没有提供创建 UoW 的范围的任何信息。
如果是暂时的。它根本不会被处理,这取决于你。
对于 InRequestScope,它将在 GC 收集 HttpContext 后被处置。但正如我最近在Ninject 邮件列表中告诉 Bob的那样,可以在 HttpApplication 的最终请求事件处理程序中释放所有对象。我将在下一版本的 Ninject 中添加对此的支持。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           929 次  |  
        
|   最近记录:  |