我已经看到了许多使用ASP.NET MVC配置Ninject的不同方法,但是随着MVC框架的每个版本的发布,实现似乎都有所改变.我正在尝试将RavenDB会话注入我的存储库.这就是我所拥有的几乎可以工作的东西.
public class MvcApplication : NinjectHttpApplication
{
...
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
protected override IKernel CreateKernel()
{
return new StandardKernel(new MyNinjectModule());
}
public static IDocumentSession CurrentSession
{
get { return (IDocumentSession)HttpContext.Current.Items[RavenSessionKey]; }
}
...
}
public class MyNinjectModule : NinjectModule
{
public override void Load()
{
Bind<IUserRepository>().To<UserRepository>();
Bind<IDocumentSession>().ToConstant(MvcApplication.CurrentSession);
}
}
Run Code Online (Sandbox Code Playgroud)
当它尝试解析IDocumentSession时,我收到以下错误.
Error activating IDocumentSession using binding from IDocumentSession to constant value
Provider returned null.
Activation path:
3) Injection of dependency IDocumentSession into parameter …Run Code Online (Sandbox Code Playgroud) 当使用EmbeddableDocumentStore对RavenDB,在什么地方得到的数据存储在磁盘上?
var documentStore = new EmbeddableDocumentStore { DataDirectory = "TestApp" };
Run Code Online (Sandbox Code Playgroud)
DataDirectory和磁盘位置之间是否存在关联?
更新:使用截至2011-08-09的最新版本.它是一个控制台应用程序,所以没有ASP.NET目录.
我正在开发一个应用程序,我在前进时会更改文档(一个小项目来学习像RavenDB这样的东西).某些更改不向后兼容,这会在我尝试获取文档时导致JSON反序列化失败.
在反序列化过程中,是否有某种方法可以将属性从旧类型转换为新类型?我Raven.Client.Lightweight用作客户端库.
例:
我有一个AllProperties在一个类中命名的属性Dictionary<string,string>.我将类型从字典更改为名为的类MetadataItemCollection.
我希望能够直接在文档存储中的文档上递增属性(如果你喜欢的话),而不必加载文档,增加属性然后再次保存,因为我最终会遇到竞争条件.
你似乎可以用Redis之类的东西做到这一点,我只是想知道Raven中是否有一些高级命令可以实现这一目标?
如果没有人能够想到一种雄辩的方法来实现这一目标吗?请记住,此计数器有可能在同一秒内多次递增,并且无法在内存中完成,然后定期刷新,因为我们处于Web场景中(我想它可以 - 但它会很讨厌).
为了在ASP.NET WebApi中刷新对RavenDB的更改,我创建了以下Action Filter:
public class RavenDbUnitOfWorkAttribute : ActionFilterAttribute
{
public Func<IDocumentSession> SessionFactory { get; set; }
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var session = SessionFactory.Invoke();
if (session != null && actionExecutedContext.Exception == null)
{
session.SaveChanges();
}
base.OnActionExecuted(actionExecutedContext);
}
}
Run Code Online (Sandbox Code Playgroud)
为了注入,IDocumentSession我创建了一个IFilterProvider循环遍历每个过滤器的自定义,并使用setter注入(StructureMap)设置任何依赖项.
我想知道IFilterProvider作用域的实例.阅读这篇文章,看起来每个请求都会创建控制器.
目前,我正在IDocumentSession使用StructureMap 明确确定每个请求的范围.问题是,如果我依赖IDependencyScope(使用嵌套容器)将相同的实例IDocumentSession注入我的Action Filter?
进一步测试似乎Action Filters不使用与Controller相同的依赖范围.我宁愿不在控制器中使用代码来刷新会话.
我已经开始使用RavenDb,我注意到RavenDb服务器根据我的查询创建自定义索引.如果我多次使用相同的索引(执行相同的查询),那么将永久创建索引.
我的问题是,为什么我想从ny代码创建一个自定义索引,如果Raven是聪明的,我应该为我创建这些索引?
我已经使用RavenDB 成功实现了推送通知(参见下面的代码).我期待实际文档包含在更改通知中.这样,所有UI客户端都可以显示信息.但是,似乎只有Id和Etag属性可用于更改的文档.
如果我希望客户端能够显示有关文档的信息,我该怎么办?客户端现在是否需要进行数据库调用以根据ID获取文档?必须进行数据库调用以获取信息似乎效率低下.但是,应该发生什么?
documentStore.Changes()
.ForDocumentsStartingWith("LogMessages")
.Subscribe(change =>
{
if (change.Type == DocumentChangeTypes.Put)
{
// Fire event so consumers can display document info
// Uh oh, are change.Id and change.Etag all we have here?
DatabaseItemAdded(null, new EventArgs<string>(change.Id));
}
});
Run Code Online (Sandbox Code Playgroud) 如何在RavenDB中以编程方式创建索引?
我试着效仿这个例子.
这是我的索引创建者:
public class MyIndex : Raven.Client.Indexes.AbstractIndexCreationTask<MyEntity>
{
public MyIndex()
{
Map = col => col.Select(c => new
{
code = c.Code,
len = c.Code.Length,
sub = c.Code.Substring(0, 1)
});
}
}
Run Code Online (Sandbox Code Playgroud)
以下是来电者:
var store = new Raven.Client.Document.DocumentStore
{
Url = "http://localhost:8080"
};
store.Initialize();
try
{
using (var session = store.OpenSession("MyDB"))
{
Raven.Client.Indexes.IndexCreation.CreateIndexes(
typeof(MyIndex).Assembly, store);
}
}
finally
{
store.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
索引已创建但不在MyDB中,而是在系统数据库中.
如何在MyDB中创建索引?我创建索引的方式是否正确?
当我们使用/ install标志将NServiceBus 3.3.6端点安装为Windows服务时,它会自动配置对消息队列的Windows服务依赖.
但是,即使我们的NServiceBus端点使用RavenDb进行持久化,安装程序也不会在RavenDb上配置服务依赖性.这意味着当我们的服务器重新启动时,由于以下异常,我们的大多数NServiceBus端点都无法启动:
System.InvalidOperationException:
The database {name} is currently being loaded, but after 30 seconds,
this request has been aborted. Please try again later, database loading continues.
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉NServiceBus设置对RavenDb的依赖,或者这是我们必须手动配置的东西,也许是使用INeedToInstallSomething<T>?
我正在尝试连接到ravenHQ,我得到了
https://database-d0sm.ravenhq.com; Database =数据库名称; ApiKey =
但是,如何将其添加到C#中的存储中?
private static IDocumentStore store = new DocumentStore()
{
Urls = new[] { "url" },
Database = "DatabaseName"
}.Initialize();
Run Code Online (Sandbox Code Playgroud)
好的,为此,我需要在.net应用程序中降级Ravendb的版本。仅Ravendb 3.5支持api密钥。这就是问题所在。