我使用的是Rob的视startesite http://mvcstarter.codeplex.com/ 与ASP.Net 视2,Ninject2,规范(http://github.com/atheken/NoRM)和需求。它的工作如此之快和developpement甚至更快,但我面临一个很大的问题,我在一点,获得连接的超时。我不知道我在做什么错误的。

我已经问了一个问题: 我得到这个错误我不明白为什么,使用的规范和Mongo在我的视项目 和这里 http://groups.google.com/group/norm-mongodb/browse_thread/thread/7882be16f030eb29 但我仍然在黑暗中。

谢谢你的帮助!

编辑* 这是我的MongoSession对象:公共类MongoSession:ISession{

    private readonly Mongo _server;

    public MongoSession()
    {
        //this looks for a connection string in your Web.config - you can override this if you want
        _server = Mongo.Create("MongoDB");
    }

    public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class {
        return _server.GetCollection<T>().AsQueryable().Where(expression).SingleOrDefault();
    }

    public IQueryable<T> All<T>() where T : class {
        return _server.GetCollection<T>().AsQueryable();
    }

    public void Save<T>(IEnumerable<T> items) where T : class {
        foreach (T item in items) {
            Save(item);
        }
    }

    public void Save<T>(T item) where T : class {
        var errors = DataAnnotationsValidationRunner.GetErrors(item);
        if (errors.Count() > 0)
        {
            throw new RulesException(errors);
        }
        _server.Database.GetCollection<T>().Save(item);
    }

    public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class
    {
        var items = All<T>().Where(expression);
        foreach (T item in items)
        {
            Delete(item);
        }
    }

    public void Delete<T>(T item) where T : class
    {
        _server.GetCollection<T>().Delete(item);
    }

    public void Drop<T>() where T : class
    {
        _server.Database.DropCollection(typeof(T).Name);

    }

    public void Dispose() {
        _server.Dispose();
    }


}

现在我MongoRepositoryBase

public abstract class MongoRepositoryBase<T> : ISession<T> where T : MongoObject
{
    protected ISession _session;

    protected MongoRepositoryBase(ISession session)
    {
        _session = session;
    }

    public T Single(ObjectId id)
    {
        return _session.All<T>().Where(x => x.Id == id).FirstOrDefault();
    }

    public T Single(Expression<Func<T, bool>> expression)
    {
        return _session.Single(expression);
    }

    public IQueryable<T> All()
    {
        return _session.All<T>();
    }

    public void Save(IEnumerable<T> items)
    {
        foreach (T item in items)
        {
            Save(item);
        }
    }

    public void Save(T item)
    {
        _session.Save(item);
    }

    public void Delete(System.Linq.Expressions.Expression<Func<T, bool>> expression)
    {
        var items = _session.All<T>().Where(expression);
        foreach (T item in items)
        {
            Delete(item);
        }
    }

    public void DeleteAll()
    {
        var items = _session.All<T>();
        foreach (T item in items)
        {
            Delete(item);
        }
    }

    public void Delete(T item)
    {
        _session.Delete(item);
    }

    public void Drop()
    {
        _session.Drop<T>();
    }

    public void Dispose()
    {
        _session.Dispose();
    }
}

和一个exemple的其它储存库的实施:

public class PlaceRepository : MongoRepositoryBase<Place>, IPlaceRepository 
{
    public PlaceRepository(ISession session) : base(session)
    {
    }

    public List<Place> GetByCategory(PlaceCategory category, bool publishedOnly)
    {
        var query = _session.All<Place>()
            .OrderBy(x => x.Name)
            .Where(x => x.Category == category);

        if (publishedOnly) query = query.Where(x => x.Published);
        if (publishedOnly) query = query.Where(x => x.ShowOnMap);

        return query.ToList();
    }

    public Place FindByName(string name)
    {
        var query = _session.All<Place>()
            .Where(x => x.Name.ToLower().Contains(name.ToLower()))
            .Where(x => x.Published);

        return query.FirstOrDefault();
    }

    public string[] FindSuggestionsByName(string name)
    {
        var query = _session.All<Place>()
            .OrderBy(x => x.Name)
            .Where(x => x.Name.ToLower().StartsWith(name.ToLower()))
            .Where(x => x.Published);

        var places = query.ToList();

        var names = new string[places.Count];
        var i = 0;
        foreach (var place in places)
        {
            names[i++] = place.Name;
        }

        return names;
    }


}
有帮助吗?

解决方案

维尼

我从来没有使用而,所以我可能方式与这一建议。但似乎可能是具有一个静态的MongoSession实例可能保持连接的开放。你有没有尝试过TransientBehavior而不是SingletonBehavior?或者,也许改变你的代码来电话处理(或使用)之后你将你的ShortcutLinks到一个清单?所有

var shortcutLionks = _session.All<ShortcutLinks>().ToList();
_session.Dispose();

一个更好的办法可能是使用某种形式的储存库中或道在本届会议的细节隐藏从控制器。我有一个RepositoryBase样 http://www.codevoyeur.com/Articles/20/A-NoRM-MongoDB-Repository-Base-Class.aspx.

斯图尔特*哈里斯有一个类似,可以说是更完整的执行情况 http://red-badger.com/Blog/post/A-simple-IRepository3cT3e-implementation-for-MongoDB-and-NoRM.aspx

汇集MongoDB连接是比较便宜的创建,所以它可能是最好,以确保数据的接入的方法处理之后,你做得/节省的数据。

其他提示

如果我添加抛出新NotImplementedException();在我MongoRepositoryBase类的Dispose()方法,它不会调用,所以我想Ninject不处理这对我来说,如果我有

protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            _recipeRepo.Dispose();
            base.OnActionExecuted(filterContext);
        }

在我的控制器,它得到的电话。这似乎是罚款,THX!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top