entity-framework - trabajo - repositorio generico entity framework
Cómo generar interfaces/definiciones mecanografiadas para entidades de brisa (2)
Estamos trabajando en esto, y todavía no tenemos una versión lanzada, pero pronto ... Póngase en contacto con nosotros en [email protected], si desea estar en nuestra lista Beta para esto.
Soy nuevo en SPA y lo estoy aprendiendo con durandal y brisa. Recientemente cambié mi solución a Typescript y me pregunto si existe alguna buena solución para generar entidades tipeadas en TypeScript basándose en el modelo de EF en el servidor. Lo único que encontré fue publicar entidades de tipo Breeze.js, pero esto es solo un pequeño fragmento de código y ni siquiera un proyecto real. Me pregunto si hay alguna mejor solución para este problema.
A continuación se muestra una página que puede colocar en su sitio para generar definiciones de interfaz de mecanografía. La página recupera los metadatos de brisa, luego itera a través de todos los tipos y genera una declaración de interfaz de mecanografía para cada tipo. El resultado de esta página se puede pegar en cualquier archivo de texto mecanografiado (* .ts) o archivo de definición de texto mecanografiado (* .d.ts). Adjunte los resultados en una declaración del módulo si desea espacios de nombres de las interfaces: declare module northwind { ... paste interfaces here... }
.
Antes de utilizar la página, deberá realizar una edición: cambie la URL del controlador del administrador de entidades de "api / northwind" a la URL de su controlador de brisa.
Las interfaces generadas dependen de las definiciones de mecanografía de Knockout.js que puede obtener aquí: https://github.com/borisyankov/DefinitelyTyped/tree/master/knockout/
Usando el ejemplo de northwind de learn.breezejs.com , el resultado de esta página del generador de definiciones sería algo como esto:
export interface Employee extends breeze.Entity {
FirstName: KnockoutObservable<string>;
LastName: KnockoutObservable<string>;
}
entonces puede ejecutar una consulta usando breeze y enviar los resultados a una matriz de empleados como esta:
var manager = new breeze.EntityManager(''api/northwind'');
var query = new breeze.EntityQuery()
.from("Employees");
manager.executeQuery(query).then(data => {
// ***cast the results to a strongly typed array of Employee***
var employees = <Employee[]>data.results;
}).fail(e => {
alert(e);
});
a continuación se encuentra la página del generador de definiciones: agregue un nuevo archivo html a su proyecto llamado "definitions.html", ejecute el proyecto y navegue a la página.
<html>
<head>
<title>Typescript Definition Generator</title>
<style>
code {
white-space: pre;
}
</style>
<script src="//code.jquery.com/jquery-2.1.0.min.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/q.js/1.0.0/q.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/breezejs/1.4.4/breeze.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var entityManager = new breeze.EntityManager(''api/northwind'');
entityManager.fetchMetadata()
.then(function () {
var html = '''',
types = entityManager.metadataStore.getEntityTypes(),
type,
i,
j,
property,
crlf = String.fromCharCode(13),
code = document.createElement(''code''),
script = document.createElement(''script'');
function getJSType(metadataType) {
if (/(Int64)|(Int32)|(Int16)|(Byte)|(Decimal)|(Double)|(Single)|(number)/.test(metadataType))
return ''number'';
else if (/(DateTime)|(DateTimeOffset)|(Time)|(Date)/.test(metadataType))
return ''Date'';
else if (/(Boolean)/i.test(metadataType))
return ''boolean'';
return ''string'';
}
for (i = 0; i < types.length; i++) {
// type declaration
var type = types[i];
html += ''export interface '' + type.shortName;
// base type
html += '' extends '';
if (type.hasOwnProperty(''baseEntityType'')) {
html += type.baseEntityType.shortName;
} else {
html += ''breeze.Entity'';
}
html += '' {'' + crlf;
// data properties
for (j = 0; j < type.dataProperties.length; j++) {
property = type.dataProperties[j];
if (type.baseEntityType && type.baseEntityType.dataProperties.filter(function (p) { return p.name === property.name; }).length > 0)
continue;
html += '' '' + property.name;
//if (property.isNullable)
// html += ''?'';
html += '': KnockoutObservable<'';
html += getJSType(property.dataType.name);
html += ''>; //'' + property.dataType.name + crlf;
}
// navigation properties
for (j = 0; j < type.navigationProperties.length; j++) {
property = type.navigationProperties[j];
if (type.baseEntityType && type.baseEntityType.navigationProperties.filter(function (p) { return p.name === property.name; }).length > 0)
continue;
html += '' '' + property.name;
//if (property.isNullable)
// html += ''?'';
if (property.isScalar)
html += '': KnockoutObservable<'';
else
html += '': KnockoutObservableArray<'';
html += property.entityType.shortName;
html += ''>;'' + crlf;
}
html += ''}'' + crlf + crlf;
}
code.innerHTML = html;
$(code).addClass(''prettyprint'');
document.body.appendChild(code);
script.setAttribute(''src'', ''//google-code-prettify.googlecode.com/svn/loader/run_prettify.js'');
document.body.appendChild(script);
})
.fail(function (reason) {
alert(reason);
});
});
</script>
</head>
<body>
</body>
</html>