我有一个PutTrigger,我想在其中做一些相当复杂的逻辑。 (包括阅读其他文档并根据其他文档中的值执行不同的操作)
由于复杂性,我想使用自己的域对象,而不是使用RavenJObjects。要以与客户端相同的形式获取我的域对象,我需要在读取实体时应用相同的约定。
总结:我需要在PutTrigger中使用DocumentStore。
任何指针?
答案 0 :(得分:1)
你真的不能这样做。 DocumentStore
类是RavenDB客户端api的一部分,它在服务器上不存在。简而言之,在服务器上运行的插件API与您习惯使用的客户端API完全不同。没有会话,约定或您用于从客户端查找的其他项目的概念。
在put触发器中,您可以通过名为Database
的属性访问数据库,该属性是DocumentDatabase
类型。数据库完全没有意识到实体 - 它严格使用文档,这就是为什么所有内容都在RavenJObject
。
如果你想在put触发器中使用自己的类,那很好。但是你需要自己处理序列化方面。
以下是一些例子:
public class Foo
{
public string Id { get; set; }
public string Name { get; set; }
// etc...
}
public class TestTrigger : AbstractPutTrigger
{
public override void OnPut(string key, RavenJObject document, RavenJObject metadata, TransactionInformation transactionInformation)
{
// example of editing the current document being stored
if (key.StartsWith("foos/"))
{
Foo foo = document.Value<Foo>();
foo.Name = "whatever"; // manipulate foo however you want
// now you have to replace the items in the doc so it saves properly
RavenJObject newDoc = RavenJObject.FromObject(foo);
foreach (var item in document)
document[item.Key] = newDoc[item.Key];
}
// example of loading and manipulating a different document
using (Database.DisableAllTriggersForCurrentThread())
{
var doc = Database.Get("foos/1", transactionInformation);
Foo foo = doc.DataAsJson.Value<Foo>();
foo.Name = "whatever";
RavenJObject newDoc = RavenJObject.FromObject(foo);
Database.Put("foos/1", null, newDoc, doc.Metadata, transactionInformation);
}
}
}
您可能想要重新考虑是否确实要使用服务器端触发器。您可能更容易使用client-side listener,例如IDocumentStoreListener
。通常,服务器端触发器保留用于广泛的功能,可以应用于许多不同类型的文档,例如我为Temporal Versioning或Indexed Attachments编写的文档。