2010-01-22 9 views
7

Tenemos una aplicación en la que deseamos exponer un gran número de entidades de bases de datos y algunas lógicas comerciales. Cada entidad requerirá la capacidad de Leer, Agregar y Actualizar. en este punto, no esperamos permitir la eliminación.API de servicio Multi Tenant para entidades comerciales y lógica comercial

el software que creamos se utiliza en una amplia gama de negocios, por lo que los servicios de oficina de operaciones con múltiples arrendatarios, también algunos de nuestros clientes utilizan este enfoque para tener bases de datos separadas por razones financieras.

Queremos ser capaces de minimizar la cantidad de puntos finales que se deben mantener. Por el momento, solo hay 3 tablas expuestas como interfaces WCF, cada una con 6 métodos adjuntos. esto es manejable pero si la operación tiene 50 bases de datos que de repente se convierten en 150 puntos finales. peor si tenemos 50 tablas expuestas que se convierten en 2500 puntos finales.

¿Alguien tiene una sugerencia sobre cómo podemos diseñar el sistema que todavía tenemos un modelo de entidad simple de Job.add (var1) o iList jobs = Job.GetSelected ("sql type read").

sin todos estos criterios de valoración

+0

Por favor, invierta en un corrector ortográfico –

Respuesta

0

Parece que usted podría pasar la "identidad" para cada consulta y tenerlo en cuenta. Esto significaría que cada registro en su tabla de "Trabajo" necesitaría tener una referencia a la "identidad" del propietario, pero eso no debería ser un gran problema.

Solo asegúrese de que cada consulta valide la "identidad", y debe estar bien.

+0

Una forma estándar de hacer esto es con un ID de sesión, que generalmente se transmite en el encabezado de la cookie HTTP. – Peter

0

Si entiendo su pregunta correctamente, creo que necesita puntos finales únicos, pero puede tener un comportamiento de servicio único al que hacen referencia sus puntos finales.

Crear un punto final predeterminado:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyService.DefaultBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

Fija tu enlace predeterminado:

<bindings> 
    <wsHttpBinding> 

    <binding name="DefaultBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"/> 
     </security> 
    </binding> 

    </wsHttpBinding> 
</bindings> 

Tiene todo punto de referencia de servicio al comportamiento predeterminado y vinculante:

<service behaviorConfiguration="MyService.DefaultBehavior" 
      name="MyService.Customer"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DefaultBinding" 
       contract="MyService.ICustomer"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 

Cada vez que se agregar un servicio, es una entrada de configuración simple.

0

Proporcionar Multicliente, sin un Bazillion puntos finales

Una forma es ir con un servicio WCF estilo REST que se pueden utilizar nombres de usuario/contraseñas para distinguir qué cliente que está trabajando, y así podrá seleccionar internamente a qué DB conectarse.WCF le da la la UriTemplate que le permite asignar parte de la URL de la década de param en sus métodos web:

Puede añadir otras plantillas de Uri para más tareas, así, como las siguientes:

¿Quién está usando mi servicio?

Al exigir clientes para suministrar un nombre de usuario y contraseña, puede asignar a que DB específico. Y utilizando el UriTemplate de /{nombreTabla}/{operación}/{params} ... usted podría entonces utilizar el código en su servicio web para ejecutar los procedimientos dados los DB de mesa, operación y params.

envolviéndolo

Su configuración web no tendría que ser alterado mucho a todos, incluso. La siguiente serie de artículos web es un excelente lugar para aprender acerca de los servicios web estilo REST, que creo que se ajusta a lo que necesita: http://www.robbagby.com/rest/rest-in-wcf-blog-series-index/

+1

Poner el "verbo" en la URL no se considera RESTful. Uno de los principios básicos de REST es usar solo GET, POST, PUT y DELETE como sus verbos. En este caso, GET reemplazaría a select, POST reemplazaría a insert y PUT reemplazaría la actualización. – Peter

+0

ah, buena captura. No me di cuenta de que lo hice en mi respuesta. por lo que las url podrían ser todas iguales, simplemente usando un verbo HTTP diferente para las operaciones básicas insertar, actualizar, eliminar y seleccionar. – ajawad987

+0

He descargado mi respuesta, gracias de nuevo Peter! – ajawad987

0

Con Apache puede usar un conjunto bastante simple de reglas de reescritura de URL para mapear un conjunto arbitrario de Tablas de tablas DB y sus puntos finales correspondientes a un solo punto final con un parámetro.

Por ejemplo, para asignar $ ROOT/nombre_tabla/COLUMN_NAME a $ ROOT/index.php tn = nombre_tabla & cn = nombre_columna, se podría añadir una regla como esta a $ ROOT/.htaccess:?

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ index.php?tn=$1&cn=$2 [QSA,L] 

después, sólo tendrá que mantener $ ROOT/index.php (que por supuesto puede generar los códigos de estado HTTP apropiados para las tablas no existentes y/o columnas).

1

WCF Data Services le permite exponer sus datos de manera RESTful utilizando el protocolo de datos abiertos (OData). Esto se llamó formalmente servicios de datos ADO.Net y antes de eso Astoria. Cualquier colección IQueryable puede estar expuesta. La forma que se muestra en la mayoría de los ejemplos es utilizar Entity Framework, sin embargo, hay ejemplos que muestran el uso con NHibernate y otras tecnologías de acceso a datos. OData es una API autodescriptiva basada en Atom-Pub con algunas extensiones personalizadas. Con una cantidad mínima de código, puede exponer su base de datos completa en un formato bien definido. Esa es la parte fácil.

Con el fin de poner en práctica múltiples Tenencia, puede crear interceptores de consulta en la aplicación WCF Data Services para implementar esa lógica. La cantidad de interceptores y la complejidad del código que escriba dependerán de su modelo de seguridad y sus requisitos. Observar algo como las plantillas T4 o CodeSmith para generar los métodos de intercepción basados ​​en su esquema de base de datos puede ser una forma de evitar muchas codificaciones manuales repetitivas.

El enlace que proporcioné tiene mucha información y tutoriales sobre Servicios de datos WCF y proporcionaría un buen lugar para comenzar a ver si satisface sus necesidades. He estado buscando en WCF Data Services un problema similar (Multi-tenancy), y me encantaría saber cómo implementar su solución.

Cuestiones relacionadas