0

我一直致力于使用Unit of Work和DI的EF Repository模式。我正在关注这个示例:link在示例中,将Unity用作DI容器,但我想使用Ninject。 (注意:在Unity中,一切正常)。 所以我建立了我的Ninject控制器工厂:link。 当我去我的控制器并尝试列出消息时,它工作正常,但是当我尝试创建消息没有任何反应时,值传递给控制器​​和存储库,但由于某种原因数据不会保存到数据库。 这里是控制器的构造函数:依赖注射与Unity一起工作,但不与Ninject一起使用

private readonly IUserRepository _userRepository; 
    private readonly IMessageThreadRepository _messageThreadRepository; 

    public TetsController(IMessageThreadRepository messageThreadRepository, IUserRepository userRepository) 
    { 
     _messageThreadRepository = messageThreadRepository; 
     _userRepository = userRepository; 
    } 

这里是messageThreadRepository代码正在由控制器称为

public class MessageThreadRepository : RepositoryBase<MessageThread>, IMessageThreadRepository 
{ 
    private readonly RepositoryBase<MessageThread> _messageThreadRepository; 
    private readonly RepositoryBase<Message> _messageRepository; 
    private readonly IUnitOfWork _unitOfWork; 
    private readonly UserRepository _userRepository; 

    public MessageThreadRepository(IUnitOfWork unitOfWork, RepositoryBase<MessageThread> messageThreadRepository, 
            IDatabaseContextFactory databaseContextFactory, UserRepository userRepository, RepositoryBase<Message> messageRepository) 
     : base(databaseContextFactory) 
    { 
     _unitOfWork = unitOfWork; 
     _messageThreadRepository = messageThreadRepository; 
     _userRepository = userRepository; 
     _messageRepository = messageRepository; 
    } 
//some code here 
// part with adding to database 
    Message message = messageFactory.CreateMessage(messageBody, userSender, messageThread); 

     _messageRepository.Add(message); 

     if (!doesThreadExist) 
     { 
      _messageThreadRepository.Add(messageThread); 
     } 

     _unitOfWork.Commit(); 
} 

编辑 我试图将用户添加到数据库中,但没有运气。我再次设法获取所有用户,但我不能在其中添加,这里是用户库:

public class UserRepository : RepositoryBase<User>, IUserRepository 
{ 
    private readonly IUnitOfWork _unitOfWork; 
    private readonly RepositoryBase<User> _repository; 

    public UserRepository(IUnitOfWork unitOfWork, IDatabaseContextFactory databaseContextFactory, RepositoryBase<User> repository) : base (databaseContextFactory) 
    { 
     _unitOfWork = unitOfWork; 
     _repository = repository; 
    } 

    public User GetUserById(int id) 
    { 
     return _repository.GetSingleByCriteria(u => u.UserId.Equals(id)); 
    } 

    public User GetUserByEmail(string email) 
    { 
     return _repository.GetSingleByCriteria(u => u.Email.Equals(email)); 
    } 

    public User GetUserByUserName(string name) 
    { 
     return _repository.GetSingleByCriteria(u => u.UserName.Equals(name)); 
    } 

    public void AddUser(User user) 
    { 
     _repository.Add(user); 
     _unitOfWork.Commit(); 
    } 

    public IEnumerable<User> GetAllUsers() 
    { 
     return _repository.GetAll(); 
    } 
} 

回答

0

我假设你使用MVC,因为你参考关于使用它与MVC的文章。

您是否在这里提到过所有步骤?

http://bubblogging.wordpress.com/2012/06/04/mvc-controller-factory-ninject/

你为什么要使用使用内置的依赖注入支持MVC的,使用Ninject.MVC3包的自定义控制器工厂呢?

+0

是的我使用它与MVC,我已经完成了所有步骤提到那里,而我不使用自定义控制器工厂,我使用Ninject.MVC3包,我不相信问题与控制器,作为控制器获取所有数据,显示数据。我相信Ninject与我的存储库有问题。 – hyperN

+0

@hyperN - 因为你没有包含你的Ninject配置代码,所以我们只能猜测。但看起来你可能在库中创建了两个DbContext,在UnitOfWork中创建了一个。您将用户添加到存储库,但在UnitOfWork上调用SaveChanges,因此没有任何事情可以保存,因为UoW上下文中没有任何内容。 –

+0

@hyperN - 另外,当你说你在问题中时,你为什么说你没有使用控制器工厂? –

相关问题