我有一个新的MVC 3应用程序,它在数据库中手动修改数据时会出现一些问题。
该工具仍处于开发阶段,偶尔我想更改用户的teamId。当我这样做时,我必须杀死Web开发服务器并再次运行它,否则查询不会选择新的teamId。 当我将工具发布到IIS时,如果我修改了数据库上的内容,我需要再次复制'bin'文件夹或停止应用程序并重新运行它。
当我从应用程序本身修改数据时,我没有问题。
这就是我的Ninject的样子:
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel kernel = new StandardKernel(new TrackerServices());
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
return null;
return (IController)kernel.Get(controllerType);
}
private class TrackerServices : NinjectModule
{
public override void Load()
{
var context = new TrackerEntities();
Bind<IUserRepository>().To<UserRepository>().WithConstructorArgument("context", context);
}
}
}
我的界面:
public interface IUserRepository : IRepository<User>
{
User GetByName(string name);
}
我的实施:
public User GetByName(string login)
{
var userLogin = _misc.GetUsername(login);
return _context.Users.Where(x => x.Login == userLogin).Single();
}
我的索引动作
public ActionResult Index()
{
var teamid = (int)_users.GetByName("myName").TeamId;
以前从未发生这种情况,但这个工具是我和Ninject一起使用的第一个工具。我想知道我的问题与使用存储库之间是否存在关联?
答案 0 :(得分:3)
有两个问题正在组合以解决此问题:
要解决这个问题,我建议您通过使用此绑定为每个请求重新创建一次存储库(因为它相当轻量级,不会有显着的性能损失):
Bind<IUserRepository>().To<UserRepository>().InRequestScope();
Ninject应该能够自动创建TrackerEntities
上下文,但如果没有(或者如果你想说清楚),你可以使用以下绑定:
Bind<TrackerEntities>().ToSelf().InRequestScope();
(此处并不真正需要InRequestScope
,因为默认的瞬态范围应该没问题。)
你也可以继续强制刷新实体(使用ObjectContext.Refresh()
),但这可能不是一个好主意,因为你必须为每个实体明确地做。