我一直致力於使用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 - 另外,當你說你在問題中時,你爲什麼說你沒有使用控制器工廠? –