首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nhibernate Isession与ninject

Nhibernate Isession与ninject
EN

Stack Overflow用户
提问于 2013-11-19 11:56:05
回答 1查看 643关注 0票数 0

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

1.nhibernate

2.ninject

3.mvc4 4/控制台(用于测试)

层是(都是类库项目)

1.演示(调用BLL层)

2.BLL(调用我的DAO层)

3.域(POCOS)

4.Nhibernate(DAO的实现)

5.Core

BLL层编码

代码语言:javascript
复制
public interface IUserService
{
   IList<User> GetAllActiveUsers();

   User GetUserDetailsByUsername(string usernameOrEmail);
}

公共类UserService :IUserService {私有只读IUserRepository userRepository;

代码语言:javascript
复制
   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层代码

代码语言:javascript
复制
 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层

代码语言:javascript
复制
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)
       {
       }
    }

核心层

代码语言:javascript
复制
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>();
        }
    }

控制台layerCoding

代码语言:javascript
复制
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,没有匹配的绑定可用,且类型不可自绑定.

我刚接触到9对象和nhibernate .Please,给了我解决方案,.I理解了问题,却找不到任何解决方案。

EN

回答 1

Stack Overflow用户

发布于 2013-11-19 13:08:04

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

代码语言:javascript
复制
   public UserRepository(ISession session)
       : base(session)
   {
   }

在这里你需要一个ISession。

您可以在IURMSUnitOfWork中构造会话,因此UserRepository无法确定会话,也无法让注入确定ISession来自何处.

相反,我建议重构您的代码,并将您的工作单元实例插入到需要它的位置,或者重构存储库来关心工作单元。

最简单的方法是用类似于IUowDAO和change的东西来扩展GetSession()

代码语言:javascript
复制
   public UserRepository(IUowDAO dao)
       : base(dao.GetSession())
   {
   }

或者类似的..。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20070917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档