none
Melhor forma de criar um serviço WCF para CRUD RRS feed

  • Pergunta

  • Prezados Senhores.

    Estamos trabalhando no desenvolvimento de uma aplicação SILVERLIGHT/C# onde o CRUD está todo em um ÚNICO SERVIÇO WCF.

    Utilizamos o modelo em camadas: UI -> WCF -> BLL -> BANCO e temos também uma classe com as entidades (MODEL).

    Todas os projetos (telas) consomem este WCF para fazer os SELECTS, INSERTS, UPDATES e DELETES.

    Como o serviço é consumido por vários projetos (telas), tenho uma variação nas queryes (instruções selects) que ficam na BLL; dependendo da tela chamadora, será um select em outra tela outro select tanto como no where destas queryes, sendo assim, acabo tendo que passar vários parâmetros na assinatura do método do meu serviço, pois, pelo que li não consigo trabalhar propriedades na instância do WCF no cliente. 

    A ideia que tive foi de criar uma classe com tais parâmetros e criar também uma propriedade em cada entidade na model desta classe, para que eu possa nas telas alimentar estas condições, porém, passar um único elemento na assinatura do meu método.

    O que vocês acham?

    A dúvida é: qual a melhor forma de chamar o serviço WCF de modo que me atenda sem a necessidade passar inúmeros parâmetros na assinatura dos métodos, visto que meus selects, where, entre outros podem ser variados... 

    Abraço

    Eduardo Agostinho Analista Programador - C# Developer

    quarta-feira, 18 de março de 2015 16:49

Respostas

Todas as Respostas

  • Eduardo,

    Pelo que entendi, seu serviço possui um número variável de parâmetros. Seria isso?

    Acredito que você possa então informar tais parâmetros como uma string XML (não sei se vc está usando um DataContract previamente definido ou utilizaria um parâmetro string mesmo). Com uma estrutura básica que deverá existir sempre, além de complementos (que são seu parâmetros variáveis), entendo que vc consiga implementar o que espera.

    Particularmente, eu prefiro evitar essas implementações genéricas e criar um serviço para cada tipo de entidade de negócio manipulada (porém não sei exatamente quais são as suas necessidades).

    Caso queira ver alguns exemplos, tenho dois artigos publicados na revista .NET Magazine discutindo a modelagem e implementação de serviços WCF:

    http://www.devmedia.com.br/implementando-soa-no-wcf-revista-net-magazine-92/23082

    http://www.devmedia.com.br/principios-de-design-de-servicos-revista-net-magazine-93/23383

    Espero ter ajudado.

    Abs

    quinta-feira, 19 de março de 2015 12:53
  • Prezado Renato.

    Muito obrigado pelas informações e já digo que foi esclarecedor...

    No caso você menciona que prefere evitar estas implementações genéricase criar um serviço para cada tipo de entidade de negócio manipulada...

    Meu banco tem em torno de 70 tabelas, ou seja, meu projeto tem esse número de BLLs e um único serviço WCF (MeuServico.svc) que expõem ConsultarNomeTabela(parametro1, parametro2, parametroX), IncluirNomeTabela(parametro), AlterarNomeTabela(parametro) de DeleteNomeTabela(parametro) para cada tabela do banco.

    Supondo que eu tenha as entidades:
    - Pessoa
    - Veiculo
    - Empresa
    - Area

    Ao seu ver, criaríamos um serviço para cada uma delas?
    - Pessoa.svc
    - Veiculo.svc
    - Empresa.svc
    - Area.svc

    Como ficariam os endpoints?

    Desculpe se entendi errado...
    Grato


    Eduardo Agostinho Analista Programador - C# Developer



    • Editado EAgostinho quinta-feira, 19 de março de 2015 18:06
    quinta-feira, 19 de março de 2015 17:37
  • Eduardo,

    Como disse, tenho a preferência por criar um serviço para cada tabela/entidade de negócio. Mas como vc mesmo indicou, há um número grande de tabelas.

    Entendo que essa abordagem complicaria bastante a sua vida. Talvez, como eu mesmo havia sugerido em cima da sua ideia inicial, o uso de strings XML permita a vc montar um único CRUD genérico sob a forma de um único serviço WCF.

    Você poderia então fazer uso de um DataContract no qual constaria um código do tipo de operação, além de parâmetros indicados através de uma string XML. Algo como:

    [DataContract]
    public class OperacaoCRUD
    {
        [DataMember]
        public string TipoOperacao { get; set; }
    
        [DataMember]
        public string ParametrosXML { get; set; }
    }

    quinta-feira, 19 de março de 2015 19:58
  • Olá, desculpem por upar o tópico, mas estou com a mesma dúvida aqui. Minha ideia inicial lá é basicamente criar a interface de contrato de forma genética, ou seja, interface genérica.

    using System.ServiceModel;
    namespace FoxMovieStoreWebService
    {
        [ServiceContract]
        public interface IDataPersistance<in T> where T : new ( )
        {
            [OperationContract]
            bool Insert ( T value );
            [OperationContract]
            bool Change ( T value );
            [OperationContract]
            bool Delete ( T value );
        }
    }

    E então criar várias implementações uma para cada entidade (CrudCliente, CrudFuncionario, etc.), por exemplo:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using FoxMovieStoreWebService.Models;
    
    namespace FoxMovieStoreWebService
    {
        public class CrudFunctionary : Crud, IDataPersistance<Functionary>
        {
            public bool Change ( Functionary value )
            {
                //Faz alguma coisa
                return true;
            }
    
            public bool Delete ( Functionary value )
            {
                //Faz alguma coisa
                return true;
    
            }
    
            public bool Insert ( Functionary value )
            {
                //Faz alguma coisa
                return true;
    
            }
        }
    }

    Porém, assim como o amigo que criou a pergunta, não sei como ficaria os o ServiceHost e os Endpoints.


    domingo, 26 de fevereiro de 2017 00:28