C# 每个MVC4视图有多个Ajax请求
我使用的是带有上下文的存储库模式,ninject作为IOC。我有一个服务来处理获取和设置数据库中的页面属性C# 每个MVC4视图有多个Ajax请求,c#,ajax,asp.net-mvc,asp.net-mvc-4,C#,Ajax,Asp.net Mvc,Asp.net Mvc 4,我使用的是带有上下文的存储库模式,ninject作为IOC。我有一个服务来处理获取和设置数据库中的页面属性 public class MyContext : DbContext { public MyContext() : base ("DefaultConnection") { } public DbSet<PageProperty> PageProperties { get; set; } public DbSet<Contact&
public class MyContext : DbContext
{
public MyContext() : base ("DefaultConnection")
{
}
public DbSet<PageProperty> PageProperties { get; set; }
public DbSet<Contact> Contacts { get; set; }
}
public class DefaultRepository : IRepository
{
MyContext _context;
public DefaultRepository(MyContext context)
{
_context = context;
}
public IQueryable<PageProperty> PageProperties { get { return _context.PageProperties; } }
public IQueryable<Contact> Contacts { get { return _context.Contacts; } }
}
public class ModuleLoader : NinjectModule
{
public ModuleLoader()
{
}
public override void Load()
{
var context = new MyContext();
context.Database.Initialize(false);
Bind<MyContext>().ToConstant(context).InSingletonScope();
Bind<IRepository>().To<DefaultRepository>();
Bind<IPagePropertyProvider>().To<DefaultPagePropertyProvider>().InSingletonScope();
}
}
public class DefaultPagePropertyProvider : IPagePropertyProvider
{
IRepository _repository;
object _syncLock = new object();
public DefaultPagePropertyProvider (IRepository repository)
{
_repository = repository;
}
public string GetValue(string pageName, string propertyName
{
lock (_syncLock)
{
var prop = page.PageProperties.FirstOrDefault(x => x.Property.Equals(propertyName) && x.PageName.Equals(pageName)).Value;
return prop;
}
}
public void SetValue(string pageName, string propertyName, string value)
{
var pageProp = _repository.PageProperties.FirstOrDefault(x => x.Property.Equals(propertyName) && x.PageName.Equals(pageName));
pageProp.Value = value;
_repository.SaveSingleEntity(pageProp);
}
}
公共类MyContext:DbContext
{
public MyContext():base(“DefaultConnection”)
{
}
公共数据库集页面属性{get;set;}
公共数据库集联系人{get;set;}
}
公共类DefaultRepository:IRepository
{
MyContext_上下文;
公共默认存储库(MyContext上下文)
{
_上下文=上下文;
}
公共IQueryable页面属性{get{return{U context.PageProperties;}}
公共IQueryable联系人{get{return\u context.Contacts;}}
}
公共类ModuleLoader:NinjectModule
{
公共ModuleLoader()
{
}
公共覆盖无效负载()
{
var context=new MyContext();
context.Database.Initialize(false);
Bind().ToConstant(上下文).InSingletonScope();
绑定()到();
绑定().To().InSingletonScope();
}
}
公共类DefaultPagePropertyProvider:IPagePropertyProvider
{
i存储库;
对象_syncLock=新对象();
公共DefaultPagePropertyProvider(IRepository存储库)
{
_存储库=存储库;
}
公共字符串GetValue(字符串pageName、字符串propertyName
{
锁(同步锁)
{
var prop=page.PageProperties.FirstOrDefault(x=>x.Property.Equals(propertyName)和&x.PageName.Equals(PageName)).Value;
返回道具;
}
}
public void SetValue(字符串pageName、字符串propertyName、字符串值)
{
var pageProp=_repository.PageProperties.FirstOrDefault(x=>x.Property.Equals(propertyName)和&x.PageName.Equals(PageName));
pageProp.Value=值;
_repository.SaveSingleEntity(pageProp);
}
}
在我看来,我正在做3个ajax调用,一个是从联系人那里获取列表以填写表格,一个是根据我使用的页面大小确定我有多少页面,另一个是设置我要使用的页面大小的ajax调用。因此,选择框会更改页面大小(每页有多少联系人:[30]),一个显示联系人的表(由jquery生成,该表对json进行小数),最后是一个包含要单击的页码列表的div。工作流是,调用GetContacts()
,此函数然后查询PageProperties
以找出要使用的页面大小,然后调用GetPages()
,此函数还查询PageProperties
以找出要使用的页面大小,SetPageSize()
设置页面大小。因此,当从div中选择页面时,SetPageSize()
然后GetContacts()
和GetPages()将使用GetContacts()
和GetPages()
在触发选择框更改事件时被调用。GetContacts()
和GetPages()
仅在第一个SetPageSize()
$时被调用。ajax
请求是done()
,并且该函数有一个成功
现在,在我将DefaultPageProperty
服务中的lock(syncLock)
添加到该服务和上下文之前,我遇到了两个错误
连接未关闭。连接的当前状态为“正在连接”
EdmType不能多次映射到CLR类
我假设因为连接处于connecting
状态,所以上下文被重用、重用、重用,所以我想把它放到SingletonScope()中
意味着只建立了一个连接,然后我对DefaultPageProperty
也有同样的想法,因为我正在对该服务进行异步调用,所以我应该对数据库查询设置一个锁
但我不知道我所做的在我使用的模式中是否正确,我想知道我是否遗漏了一些基本的东西?我的问题是,这是一个正确/可行的解决方案,不会在以后的道路上产生任何警告?我是真的解决了这个问题还是只是创造了更多的问题?我重新设计了它他是我现在处理上下文的方式
我有自己的上下文,然后实现名为DefaultContextFactory
的IDbContextFactory
并注入它们
在公共构造函数\u context=contextFactory.Create();
中的存储库中
然后,在整个存储库中,我只使用\u context.WhatEver()
,这很好
我还在ModuleLoader
Bind().To().InTransientScope()
中进行了操作,以便每次调用它时都创建一个新的存储库
我不需要存储库工厂,因为我只有一个存储库!如果您使用的是SingletonScope
服务,该服务可以创建到数据库的连接。我相信singleton创建的所有依赖项在默认情况下也会成为singleton…包括您的上下文。因此,您总是可以这样做你是说,如果MyContext
在SingletonScope()
中,那么任何使用MyContext
的基本上都是我的服务的东西都会变成SingletonScope()
?@Malachi我已经在CodeReview上发布了它,但是stackoverflow获得了更多的流量!我听说,那里没有那么多流量,因为没有太多人在那里发布。我将花一段时间进行代码审查。我会在这两个地方发布,但我认为这可能违反了规则……从MetaStack上看,它看起来像Cross的帖子是不受欢迎的,但是关于这个问题的帖子已经超过3年了。