سؤال

أنا أستخدم أداة نموذج الكائن المدفوعة CodeFluentEntities من أجل نشر نموذج إلى محرك قاعدة البيانات.

أفكر في استخدام محركات قاعدة بيانات localStorage (مثل IndexedDB أو Web SQL) لتخزين بياناتي لتطبيق ويب بدون خادم.

نظرت في توثيق ولكن يبدو لي فقيراً بعض الشيء..أعتقد أنني فهمت المبادئ الأساسية مثل نقاط الحقن الموجودة Produce() و Terminate() ولكن ماذا عن الدليل المستهدف للإنتاج الفعلي؟

في حالتي، وهي ملفات كود مصدر جافا سكريبت، كيف يمكنني تحديد مكان إنشائها بشكل صحيح (بطريقة مرجعية)؟وهل يجب أن يكون في مشروع خارجي، أم يمكنني فقط ملء دليل في مشروع آخر (وهو .vsproj لتطبيق الويب الخاص بي، على سبيل المثال)؟

هل يمكن للوثائق دمج عينة من التعليمات البرمجية المتعلقة بهذه الجوانب، أو يمكن لأي شخص إعادة توجيهي إلى مقالة تناسب احتياجاتي؟

هل كانت مفيدة؟

المحلول

نهج القالب

وفقًا لاحتياجاتك، أقترح عليك استخدام قالب بدلاً من تطوير منتجك المخصص لأسباب من بينها أسباب النشر.باستخدام منتج القالب (المرفق مع CodeFluent Entities)، يمكنك إنشاء نصوص برمجية معقدة بسرعة وسهولة من خلال الاستفادة من النموذج التعريفي لـ CodeFluent Entities.

يعتمد هذا المنتج على محرك قوالب CodeFluent Entities ويسمح لك بإنشاء ملفات نصية (JavaScript في حالتك) في وقت الإنتاج.للتذكير، القالب هو ببساطة مزيج من الكتل النصية ومنطق التحكم الذي يمكنه إنشاء ملف إخراج

يعتني هذا المنتج بجميع العمليات المشتركة:قم بتحديث المشروع (.XXproj) لإضافة الملفات التي تم إنشاؤها وإضافة المراجع المفقودة وما إلى ذلك.يمكنك العثور بعد ذلك على مثال لإنشاء ملف برنامج نصي IndexDB استنادًا إلى نموذج CodeFluent Entities (لأغراض العرض التوضيحي فقط).إليك ملف مصدر القالب:

[%@ 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 الخاص بك عن طريق إضافة منتج القوالب وتحديد القالب أعلاه باعتباره الملف المصدر.

إذا نظرت إلى النموذج التالي:

ما عليك سوى إنشائه لإنشاء ملف البرنامج النصي IndexDB في المشروع المستهدف (تطبيق ويب على سبيل المثال) وستكون قادرًا على التعامل مع واجهة برمجة التطبيقات التي تم إنشاؤها مثل هذا:

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 Entities محليًا، فيمكنك إنشاء منتج مخصص خاص بك عن طريق تنفيذ واجهة 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 بعض الفئات الأساسية التي تنفذ واجهة IProducer مثل BaseProducer الموجود في مجموعة CodeFluent.Producers.CodeDom التي توفر سلوكيات مثل "إضافة مراجع مفقودة" أو "تحديث مشروع Visual Studio (.XXproj).

بالإضافة إلى ذلك، وهنا أ مشاركة مدونة والتي يمكن أن تساعدك على دمج منتج مخصص للمصمم.

نهج المنتج الفرعي

قد يكون النهج الآخر هو تطوير منتج فرعي مخصص ولكن في رأيي أنها ليست مناسبة لاحتياجاتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top