与ninject的Nhibernate Isession

时间:2013-11-19 11:56:05

标签: asp.net-mvc-4 nhibernate ninject

我正在使用以下框架构建mvc4 n层应用程序

1.nhibernate

2.ninject

3.mvc4 / Console(用于测试)

图层是(所有都是类库项目)

1.Presentation(调用BLL层)

2.BLL(调用我的DAO图层)

3.Domain(POCOS)

4.Nhibernate(DAO的实施)

5.Core

BLL图层编码

public interface IUserService
{
   IList<User> GetAllActiveUsers();

   User GetUserDetailsByUsername(string usernameOrEmail);
}

公共类UserService:IUserService     {        private readonly IUserRepository userRepository;

   public UserService(IUserRepository userRepository)
   {
       this.userRepository = userRepository;
   }

   public IList<User> GetAllActiveUsers()
   {
       var activeUserList = from user in userRepository.All()
                            where user.ACTIVE_STATUS == true
                            select user;
       return activeUserList.ToList<User>();
   }




   public User GetUserDetailsByUsername(string usernameOrEmail)
   {
       var registerUser = from user in userRepository.All()
                          where user.USER_NAME == usernameOrEmail
                          select user;
       return (User)registerUser;
   }
}

DAO图层代码

 public interface IRepository<TKey, TEntity> where TEntity : class
{
    IQueryable<TEntity> All();
    TEntity FindBy(Expression<Func<TEntity, bool>> expression);
    IQueryable<TEntity> FilterBy(Expression<Func<TEntity, bool>> expression);
    TEntity FindBy(TKey id);
    bool Add(TEntity entity);
    bool Add(IEnumerable<TEntity> items);
    bool Update(TEntity entity);
    bool Delete(TEntity entity);
    bool Delete(IEnumerable<TEntity> entities);
}



public interface IUowDAO:IDisposable
    {

        void Commit();
        void Rollback();

    }


public interface IUserRepository:IRepository<long,User>
    {
    }

DAO.Nhibernate Layer

public class IURMSNhibernateRepository<TKey, T> : IRepository<TKey, T> where T : class
    {
        private readonly ISession _session;

        public IURMSNhibernateRepository(ISession session)
        {
            _session = session;
        }


        public bool Add(T entity)
        {
            _session.Save(entity);
            return true;
        }

        public bool Add(IEnumerable<T> items)
        {
            foreach (T item in items)
            {

                _session.Save(item);
            }
            return true;
        }

        public bool Update(T entity)
        {
            _session.SaveOrUpdate(entity);
            return true;
        }

        public bool Delete(T entity)
        {
            _session.Delete(entity);
            return true;
        }

        public bool Delete(IEnumerable<T> entities)
        {
            foreach (T entity in entities)
            {
                _session.Delete(entity);

            }
            return true;
        }

        public System.Linq.IQueryable<T> All()
        {
            return _session.Query<T>();
        }

        public T FindBy(System.Linq.Expressions.Expression<Func<T, bool>> expression)
        {
            return FilterBy(expression).SingleOrDefault();
        }

        public System.Linq.IQueryable<T> FilterBy(System.Linq.Expressions.Expression<Func<T, bool>> expression)
        {
            return All().Where(expression).AsQueryable();
        }

        public T FindBy(TKey id)
        {
            return _session.Get<T>(id);
        }
    }




public class IURMSUnitOfWork:IUowDAO
    {

        private readonly ISessionFactory _sessionFactory;
        private readonly ITransaction _transaction;
        public ISession Session { get; private set; }




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




        public void Commit()
        {
            if (!_transaction.IsActive)
            {
                throw new InvalidOperationException("Oops! We don't have an active transaction");
            }
            _transaction.Commit();
        }

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

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

public class UserRepository:IURMSNhibernateRepository<long,User>,IUserRepository
    {
       public UserRepository(ISession session)
           : base(session)
       {
       }
    }

核心层

public class BuisnessLogicModule:NinjectModule
    {
        public override void Load()
        {
            Bind<IUserService>().To<UserService>();
        }
    }
public  class DataAccessLogicModule:NinjectModule
    {

        public override void Load()
        {

            Bind<IUowDAO>().To<IURMSUnitOfWork>().InTransientScope();

            Bind(typeof(IRepository<,>)).To(typeof(IURMSNhibernateRepository<,>));

            Bind<IUserRepository>().To<UserRepository>();
        }
    }

控制台图层编码

public interface IConsole
    {
       IList<User> GetAllUsers();
    }

public class ConsoleUser:IConsole
    {
       private readonly IUserService _userService;
       public ConsoleUser(IUserService UserService)
       {
           this._userService = UserService;
       }
        public IList<IURMSPOC.DOMAIN.User> GetAllUsers()
        {
            var user = _userService.GetAllActiveUsers();
            return user;
        }
    }



public  class TopModule:NinjectModule
    {
        public override void Load()
        {
            Bind<IConsole>().To<ConsoleUser>();
        }
    }
public class Program
    {
        static void Main(string[] args)
        {
            IKernel kernel = new StandardKernel(new TopModule());

            var modules = new List<INinjectModule>
            {
                new IURMSPOC.CORE.Dependency.BuisnessLogicModule(),
                new IURMSPOC.CORE.Dependency.DataAccessLogicModule(),
            };
            kernel.Load(modules);

            var topClass = kernel.Get<IConsole>();
            var message = topClass.GetAllUsers();
            System.Console.WriteLine(message);

            System.Console.WriteLine("Press enter to continue...");
            System.Console.ReadLine();
        }
    }

但是当我运行应用程序时,错误显示 错误激活ISession 没有匹配的绑定可用,并且该类型不可自我绑定。

我是ninject和nhibernate的新手。请给我解决方案。我理解问题但找不到任何解决方案。

1 个答案:

答案 0 :(得分:0)

这不是Nhibernate的问题,我想错误来自

的ctor
   public UserRepository(ISession session)
       : base(session)
   {
   }

您需要ISession的地方。

您在IURMSUnitOfWork中构建会话,因此UserRepository无法确定会话或注入以确定ISession来自哪里......

相反,我建议重构您的代码并将您的工作单元实例注入所需的位置,或者重构存储库以关注工作单元。

最简单的方法是使用类似GetSession()的内容来扩展IUowDAO 并改变

   public UserRepository(IUowDAO dao)
       : base(dao.GetSession())
   {
   }

或类似的......

你的实现有点奇怪。您的数据访问对象具有事务等的签名...对于使用nhibernate的基本工作单元实现,可以读取this article。 您缺少的基本上是会话工厂。