Javascript 如何正确创建新的制作人?

Javascript 如何正确创建新的制作人?,javascript,sql,local-storage,producer,codefluent,Javascript,Sql,Local Storage,Producer,Codefluent,我正在使用驱动对象模型工具将模型部署到数据库引擎 我正在考虑使用localStorage数据库引擎(如IndexedDB或Web SQL)来为没有服务器的Web应用程序存储数据 我看了看照片,但在我看来有点可怜。。。我想我理解了一些基本原则,比如注入点,它们是product()和Terminate(),但是实际生产的目标目录呢 在我的例子中,是Javascript源代码文件,如何正确地指定(以引用的方式)在何处生成它们?它必须在一个外部项目中,还是我可以在另一个项目中填充一个目录(例如,我的we

我正在使用驱动对象模型工具将模型部署到数据库引擎

我正在考虑使用localStorage数据库引擎(如IndexedDB或Web SQL)来为没有服务器的Web应用程序存储数据

我看了看照片,但在我看来有点可怜。。。我想我理解了一些基本原则,比如注入点,它们是
product()
Terminate()
,但是实际生产的目标目录呢

在我的例子中,是Javascript源代码文件,如何正确地指定(以引用的方式)在何处生成它们?它必须在一个外部项目中,还是我可以在另一个项目中填充一个目录(例如,我的webapp的.vsproj)

文档是否可以集成有关此方面的代码示例,或者有人可以将我重定向到适合我需要的文章?

模板方法 根据您的需要,我建议您使用一个模板,而不是开发自定义生产者,因为除其他外,还有部署原因。使用模板生成器(与CodeFluent实体一起提供),您可以利用CodeFluent实体元模型快速轻松地创建复杂脚本

该生成器基于CodeFluent Entities的模板引擎,允许您在生产时生成文本文件(本例中为JavaScript)。 提醒一下,模板只是可以生成输出文件的文本块和控制逻辑的混合体

此生产者负责所有常见操作:更新项目(.XXproj)以添加生成的文件、添加缺少的引用等。 您可以找到一个基于CodeFluent实体模型生成IndexDB脚本文件的示例(仅用于演示)。以下是模板源文件:

[%@ 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);
然后,您需要通过添加模板生成器来配置CodeFluent Entities项目,并将上面的模板定义为源文件

如果你考虑以下模型:

只需构建它以在目标项目(例如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()
定制生产者方法 然而,如果您需要针对CodeFluent实体本机不支持的技术或平台,您可以通过实现IProducer接口创建自己的自定义生产者:

public interface IProducer
{
    event Producer.OnProductionEventHandler Production;

    void Initialize(Project project, Producer producer);
    void Produce();
    void Terminate();
}
首先,您需要了解CodeFluent Entitie构建引擎逐个调用每个已配置的生产者来生成代码

首先,CodeFluent实体为每个生产者调用
Initialize
方法。它将CodeFluent实体项目的实例和当前生产者作为参数。 然后,它按照相同的过程调用
Product
方法。这是实现您的生成逻辑的正确位置。 最后,您可以在
Terminate
方法中实现finalize逻辑

CodeFluent提供了一些实现IProducer接口的基类,例如位于CodeFluent.Producers.CodeDom程序集中的BaseProducer,它提供了“添加缺少的引用”或“更新Visual Studio项目(.XXproj)”等行为

此外,这里还有一个可以帮助您将自定义生产者集成到建模器中的方法

次级生产者方法 另一种方法可能是开发一个应用程序,但在我看来,它不适合您的需要