如何正确创建一个新的生产者?
-
21-12-2019 - |
题
我正在使用驱动对象模型工具 codefluententities ,以便将模型部署到数据库引擎。
我正在考虑使用localstorage数据库引擎(如索引DB或Web SQL),以便在没有服务器的情况下将我的数据库存储在Web应用程序中。
我看着文档,但在我看来有点差...我想我了解了像生成的注射点一样的基本原则,也是生成的基本原则,而是实际生产的目标目录呢?
在我的情况下,这是JavaScript源代码文件,如何正确指定(以引用的方式)在哪里生成它们?它是否必须在外部项目中,或者我可以填充其他项目中的目录(每个示例是我的webapp的.vsproj)?
文档可以集成关于这个方面的代码样本,或者某人可以将我重定向到拟合我需求的文章?
解决方案
模板方法
根据您的需求,我建议您使用模板而不是开发自定义制作人,因为等等部署原因。使用模板制作人(附带代码群实体),您可以通过利用CodeFent Entiture Meta模型来快速且轻松地创建复杂的脚本。
本生产商基于CodeFent Entities的模板引擎,并允许您在生产时间生成文本文件(案例中的JavaScript)。 作为提醒,模板只是文本块和控制逻辑的混合,可以生成输出文件
此生产商负责所有常见操作:更新项目(.xxproj)以添加生成的文件,添加缺少的引用等。 您可以在此后找到基于Codefluent实体模型生成索引DB脚本文件的示例(仅限演示目的)。这是模板源文件:
[%@ reference name="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll" %]
[%@ namespace name="System" %]
[%@ namespace name="System.Linq" %]
[%@ namespace name="CodeFluent.Model" %]
var context = {};
context.indexedDB = {};
context.indexedDB.db = null;
context.indexedDB.open = function () {
var version = 11;
var request = indexedDB.open([%=Producer.Project.DefaultNamespace%], version);
request.onupgradeneeded = function (e) {
var db = e.target.result;
e.target.transaction.onerror = context.indexedDB.onerror;
[%foreach(Entity entity in Producer.Project.Entities){
string properties = String.Join(", ", entity.Properties.Where(p => !p.IsPersistenceIdentity).Select(p => "\"" + p.Name + "\""));
%]
if (db.objectStoreNames.contains("[%=entity.Name%]")) {
db.deleteObjectStore("[%=entity.Name%]");
}
var store = db.createObjectStore("[%=entity.Name%]",
{ keyPath: "id", autoIncrement: true });
store.createIndex([%=properties %], { unique: false });[%}%]
};
request.onsuccess = function (e) {
context.indexedDB.db = e.target.result;
};
request.onerror = context.indexedDB.onerror;
};
[%foreach(Entity entity in Producer.Project.Entities){
string parameters = String.Join(", ", entity.Properties.Where(p => !p.IsPersistenceIdentity).Select(p => p.Name));%]
context.indexedDB.[%=entity.Name%] = {}
context.indexedDB.[%=entity.Name%].add = function ([%= parameters %]) {
var db = context.indexedDB.db;
var trans = db.transaction(["[%=entity.Name%]"], "readwrite");
var store = trans.objectStore("[%=entity.Name%]");
var request = store.put({
[%
foreach (Property property in entity.Properties.Where(p => !p.IsPersistenceIdentity)) {%]
"[%=property.Name%]": [%=property.Name%], [%}%]
"timeStamp": new Date().getTime()
});
request.onsuccess = function (e) {
console.log(e.value);
};
request.onerror = function (e) {
console.log(e.value);
};
};
context.indexedDB.[%=entity.Name%].delete = function (id) {
var db = context.indexedDB.db;
var trans = db.transaction(["[%=entity.Name%]"], "readwrite");
var store = trans.objectStore("[%=entity.Name%]");
var request = store.delete(id);
request.onsuccess = function (e) {
console.log(e);
};
request.onerror = function (e) {
console.log(e);
};
};
context.indexedDB.[%=entity.Name%].loadAll = function () {
var db = context.indexedDB.db;
var trans = db.transaction(["[%=entity.Name%]"], "readwrite");
var store = trans.objectStore("[%=entity.Name%]");
var keyRange = IDBKeyRange.lowerBound(0);
var cursorRequest = store.openCursor(keyRange);
request.onsuccess = function (e) {
// not implemented
};
request.onerror = function (e) {
console.log(e);
};
};
[%}%]
function init() {
context.indexedDB.open(); // initialize the IndexDB context.
}
window.addEventListener("DOMContentLoaded", init, false);
.
然后,您需要通过添加模板制作人来配置CodeFent实体项目,并将上面的模板定义为源文件。
如果考虑以下型号:
只需构建它以在目标项目(例如Web应用程序中)生成indexDB脚本文件,您将能够操纵这样的生成API:
context.indexedDB.Contact.add("Peter", "Boby")
context.indexedDB.Product.add("Tablet")
context.indexedDB.Product.add("Computer")
context.indexedDB.Contact.delete(1)
context.indexedDB.Product.loadAll()
.
自定义制作人方法
尽管如此,如果您需要针对不受CodeFent Entities实体支持的技术或平台,则可以通过实现IProducer界面来创建自己的自定义制作人:public interface IProducer
{
event Producer.OnProductionEventHandler Production;
void Initialize(Project project, Producer producer);
void Produce();
void Terminate();
}
.
首先,您需要了解CodeFluent Enitie Build Engine逐个调用每个已配置的生产者来生成您的代码。
首先,CodeFluent实体调用每个生产者的Initialize
方法。它将作为CodeFly Entities项目和当前生产商的参数。
然后它调用在相同的过程之后的Product
方法。这是实现您的生成逻辑的正确位置。
最后,您可以在Terminate
方法中实现最终确定逻辑。
codeFent提供了一些基类,它实现了Iproducer接口,例如基本的Ploducer,它位于CodeFluent.Producers.CodeDom汇编程序,该组件提供“添加缺少引用”或“更新Visual Studio项目(.xxproj)等行为。
另外,这里是一个博客文章可以帮助您将自定义生产者集成到建模器中。
子生产者方法
其他方法可能是开发一个自定义子生产商但是我的意见,根据您的需求并不适合。