문제

구동 개체 모델 도구를 사용하고 있습니다. CodeFluent엔터티 데이터베이스 엔진에 모델을 배포하기 위해.

서버 없이 웹 애플리케이션용 데이터를 저장하기 위해 localStorage 데이터베이스 엔진(예: IndexedDB 또는 Web SQL)을 사용하려고 합니다.

나는 들여다 보았다. 선적 서류 비치 그런데 좀 가난한 것 같아요..주입점 같은 기본적인 원리는 이해한 것 같아요. Produce() 그리고 Terminate() 하지만 실제 프로덕션의 대상 디렉터리는 어떻습니까?

제 경우에는 Javascript 소스 코드 파일을 생성할 위치를 참조된 방식으로 올바르게 지정하려면 어떻게 해야 합니까?그리고 외부 프로젝트에 있어야 합니까, 아니면 다른 프로젝트(예를 들어 내 webapp의 .vsproj)에 디렉터리를 채울 수 있습니까?

문서에 이 측면과 관련된 코드 샘플이 통합되어 있습니까? 아니면 누군가가 내 필요에 맞는 문서로 나를 리디렉션할 수 있습니까?

도움이 되었습니까?

해결책

템플릿 접근 방식

귀하의 필요에 따라 배포 이유 등으로 인해 사용자 정의 생산자를 개발하는 대신 템플릿을 사용하는 것이 좋습니다.CodeFluent Entities와 함께 제공되는 템플릿 생산자를 사용하면 CodeFluent Entities 메타 모델을 활용하여 복잡한 스크립트를 빠르고 쉽게 만들 수 있습니다.

이 생산자는 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 엔터티 프로젝트를 구성하고 위의 템플릿을 소스 파일로 정의해야 합니다.

다음 모델을 고려한다면 :

대상 프로젝트(예: 웹 애플리케이션)에서 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 Build 엔진이 구성된 각 생산자를 하나씩 호출하여 코드를 생성한다는 점을 이해해야 합니다.

먼저 CodeFluent 엔터티는 다음을 호출합니다. Initialize 생산자별 방식입니다.CodeFluent Entities 프로젝트의 인스턴스와 현재 생산자를 매개 변수로 사용합니다.그런 다음 Product 동일한 과정을 따르는 방법.생성 논리를 구현하기에 적합한 장소입니다.마지막으로, 최종화 논리를 구현할 수 있습니다. Terminate 방법.

CodeFluent는 "누락된 참조 추가" 또는 "Visual Studio 프로젝트 업데이트(.XXproj)"와 같은 동작을 제공하는 CodeFluent.Producers.CodeDom 어셈블리에 있는 BaseProducer와 같은 IProducer 인터페이스를 구현하는 일부 기본 클래스를 제공합니다.

게다가 여기에는 블로그 게시물 이는 사용자 정의 생산자를 모델러에 통합하는 데 도움이 될 수 있습니다.

하위 생산자 접근 방식

또 다른 접근 방식은 다음과 같습니다. 맞춤형 서브 프로듀서 하지만 제 생각에는 그것은 귀하의 필요에 적합하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top