Entity framework 依赖注入与Unity一起工作,但不';和Ninject在一起

Entity framework 依赖注入与Unity一起工作,但不';和Ninject在一起,entity-framework,dependency-injection,ninject,unity-container,unit-of-work,Entity Framework,Dependency Injection,Ninject,Unity Container,Unit Of Work,我一直在使用工作单元和DI开发EF存储库模式。我遵循这个示例:在示例中,Unity用作DI容器,但我想使用Ninject。 (注:使用Unity时,一切正常)。 所以我把我的Ninject控制器工厂设置成这样:。 当我转到我的控制器并尝试列出消息时,它工作正常,但当我尝试创建消息时,什么也没有发生,值被传递到控制器和存储库,但由于某种原因,数据并没有保存到数据库。 以下是控制器构造函数: private readonly IUserRepository _userRepository;

我一直在使用工作单元和DI开发EF存储库模式。我遵循这个示例:在示例中,Unity用作DI容器,但我想使用Ninject。 (注:使用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();
}
公共类MessageThreadRepository:RepositoryBase,IMessageThreadRepository
{
私有只读存储库库_messageThreadRepository;
私有只读存储库库(messageRepository);
私人只读i工作单元(unitof工作单元);;
私有只读用户存储库_UserRepository;
public MessageThreadRepository(IUnitOfWork unitOfWork、RepositoryBase MessageThreadRepository、,
IDatabaseContextFactory数据库ContextFactory,UserRepository UserRepository,RepositoryBase messageRepository)
:base(databaseContextFactory)
{
_unitOfWork=unitOfWork;
_messageThreadRepository=messageThreadRepository;
_userRepository=userRepository;
_messageRepository=messageRepository;
}
//这里有一些代码
//与添加到数据库无关
Message Message=messageFactory.CreateMessage(messageBody、userSender、messageThread);
_messageRepository.Add(message);
如果(!doesthread exist)
{
_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();
    }
}
public类UserRepository:RepositoryBase,IUserRepository
{
私人只读i工作单元(unitof工作单元);;
私有只读RepositoryBase\u存储库;
公共用户存储库(IUnitOfWork unitOfWork,IDatabaseContextFactory databaseContextFactory,RepositoryBase repository):基本(databaseContextFactory)
{
_unitOfWork=unitOfWork;
_存储库=存储库;
}
公共用户GetUserById(int id)
{
return _repository.GetSingleByCriteria(u=>u.UserId.Equals(id));
}
公共用户GetUserByEmail(字符串电子邮件)
{
return _repository.GetSingleByCriteria(u=>u.Email.Equals(Email));
}
公共用户GetUserByUserName(字符串名称)
{
return _repository.GetSingleByCriteria(u=>u.UserName.Equals(name));
}
public void AddUser(用户)
{
_添加(用户);
_unitOfWork.Commit();
}
公共IEnumerable GetAllUsers()
{
返回_repository.GetAll();
}
}

我假设您正在使用MVC,因为您参考了一篇关于将其与MVC结合使用的文章

你完成这里提到的所有步骤了吗


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

是的,我将它与MVC一起使用,我已经完成了上面提到的所有步骤,我没有使用自定义控制器工厂,我使用的是Ninject.MVC3包,我不认为控制器有问题,当控制器获取所有数据时,显示数据。我相信Ninject在我的存储库中有问题。@hyperN-因为您没有包含Ninject配置代码,我们只能猜测。但看起来您可能正在创建两个DBContext,一个在存储库中,另一个在UnitOfWork中。您将用户添加到存储库,但在UnitOfWork上调用SaveChanges,因此不会保存任何内容,因为UoW上下文中没有任何内容。@hyperN-另外,当你回答你的问题时,为什么说你没有使用控制器工厂?这看起来不像是通常出现在App_Start文件夹中的Ninject.MVC4软件包中的引导程序。