C# 每个MVC4视图有多个Ajax请求

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&

我使用的是带有上下文的存储库模式,ninject作为IOC。我有一个服务来处理获取和设置数据库中的页面属性

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年了。