新しいプロデューサーを正しく作成するには?
-
21-12-2019 - |
質問
駆動オブジェクトモデルツールを使用しています。 。
サーバーなしでWebアプリケーションのために私のデータを保存するために、LocalStorageデータベースエンジン(indexeddbまたはWeb SQLなど)の使用について考えています。
ドキュメントに見えましたが、少し貧弱なようです...私は、Produce()
とTerminate()
の射出点のような基本原則を理解していましたが、実際の生産のターゲットディレクトリについてはどうでしょうか。
JavaScriptのソースコードファイルであるマイケースでは、(参照的な方法で)正しく指定するにはどうすればよいですか。そしてそれは外部のプロジェクトに参加する必要がありますか、それとも他のプロジェクトにディレクトリを埋めるだけで(例:1例あたりの.vsproj)?
この側面に関するコードのサンプルを統合することもできます、あるいは誰かが私のニーズに合う記事に私をリダイレクトすることができますか?
解決
テンプレートアプローチ
あなたのニーズに応じて、私はあなたのカスタムプロデューサーを開発する代わりにテンプレートを使用することをお勧めします。テンプレートプロデューサー(Codefluent Entitiesに同梱)を使用すると、Codeflueentエンティティメタモデルを利用して、複雑なスクリプトをすばやく簡単に作成できます。
このプロデューサは、CodeFluetエンティティのテンプレートエンジンに基づいており、本番時にテキストファイル(JavaScript)を生成することを可能にします。 リマインダーとして、テンプレートは単に出力ファイルを生成できるテキストブロックと制御ロジックの混合物です。
このプロデューサーはすべての共通操作の世話をします。プロジェクト(.xxproj)を更新して、生成されたファイルを追加し、欠けている参照を追加します。 その後、Codeflueentエンティティモデルに基づいて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);
.
次に、テンプレートプロデューサを追加し、上のテンプレートをソースファイルとして定義することで、CodeFluestエンティティプロジェクトを設定する必要があります。
次のモデルを考える場合:
ターゲットプロジェクト(たとえば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()
.
カスタムプロデューサーアプローチ
それでも、CodeFlueentエンティティでサポートされていないテクノロジやプラットフォームをネイティブにターゲットにターゲットにする必要がある場合は、IPRoDucerインターフェイスを実装することで独自のカスタムプロデューサを作成することができます。public interface IProducer
{
event Producer.OnProductionEventHandler Production;
void Initialize(Project project, Producer producer);
void Produce();
void Terminate();
}
.
まず、CodeFluent Entile Build Engineがあなたのコードを生成するためにそれぞれの設定されたプロデューサーを1つずつ呼び出すことを理解する必要があります。
最初に、CodeFluetエンティティはプロデューサごとにInitialize
メソッドを呼び出します。 Codefluentエンティティプロジェクトと現在のプロデューサのインスタンスのパラメータとしてかかります。
その後、同じプロセスに従ってProduct
メソッドを呼び出します。世代ロジックを実装するのが正しい場所です。
最後に、Terminate
メソッドでファイナイズロジックを実装できます。
CodeFluentは、CodeFluent.Producers.CodedomアセンブリのようなIPRoDucerインターフェースを実装する基本クラスを提供しています。
さらに、 Blog POST カスタムプロデューサーをモデラーに統合するのに役立ちます。
サブプロデューサーアプローチ
他のアプローチは、カスタムサブプロデューサです。私の意見、あなたのニーズに応じては適していません。