我一直致力于使用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();
}
}
是的我使用它与MVC,我已经完成了所有步骤提到那里,而我不使用自定义控制器工厂,我使用Ninject.MVC3包,我不相信问题与控制器,作为控制器获取所有数据,显示数据。我相信Ninject与我的存储库有问题。 – hyperN
@hyperN - 因为你没有包含你的Ninject配置代码,所以我们只能猜测。但看起来你可能在库中创建了两个DbContext,在UnitOfWork中创建了一个。您将用户添加到存储库,但在UnitOfWork上调用SaveChanges,因此没有任何事情可以保存,因为UoW上下文中没有任何内容。 –
@hyperN - 另外,当你说你在问题中时,你为什么说你没有使用控制器工厂? –