none
Contrato em class library RRS feed

  • Pergunta

  • Olá gostaria de uma ajuda.

    Estou criando um projeto que utiliza WCF e está ocorrendo o seguinte erro:

    System.InvalidOperationException: O nome de contrato 'Dominio.Repositorio.IRepositorioCliente' não pôde ser encontrado na lista de contratos implementados pelo serviço 'RepositorioCliente'.

    Acontece que eu tenho tres projetos, Dominio, RepositorioWCF, e Servidor. A classe de dados e o contrato de serviço estão no projeto de Dominio. Aqui estão as tres classes do Dominio.

     

    namespace Dominio.Repositorio
    {
    [ServiceContract]
    public interface IRepositorio<T>
    {
    [OperationContract]
    int Criar(T obj);

    [OperationContract]
    void Atualizar(T obj);

    [OperationContract]
    T BuscarPorId(int id);

    [OperationContract]
    List<T> BuscarTodos();

    }
    }
    namespace Dominio
    {
    [DataContract]
    public class Cliente
    {

    [DataMember]
    public int IdCliente { get; set; }

    [DataMember]
    public string NomeCliente { get; set; }

    [DataMember]
    public bool Ativo { get; set; }

    }
    }
    namespace Dominio.Repositorio
    {
    public interface IRepositorioCliente: IRepositorio<Cliente>
    {
    }
    }

    E aqui está a classe concreta que fica no projeto RepositorioWCF:

    namespace RepositorioWCF
    {
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config.
    public class RepositorioCliente : Dominio.Repositorio.IRepositorioCliente
    {

    Eliminei o resto do código para ficar enxuto. E por ultimo meu app.config:

      <system.serviceModel>
    <services>
    <service behaviorConfiguration="RepositorioWCF.RepositorioClienteBehavior"
    name="RepositorioWCF.RepositorioCliente">
    <endpoint address="" binding="wsHttpBinding" contract="Dominio.Repositorio.IRepositorioCliente">
    <identity>
    <dns value="localhost" />
    </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8731/Design_Time_Addresses/RepositorioWCF/RepositorioCliente/" />
    </baseAddresses>
    </host>
    </service>
    </services>
    <behaviors>
    <serviceBehaviors>
    <behavior name="RepositorioWCF.RepositorioClienteBehavior">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>

     

    Acredito q ele não está achando o contrato por estar em outro projeto. Eu tenho como fazer isto? ou o meu app.config que está errado?

     

    Até mais.

    Agradeço a atenção de quem puder ajudar.



    Se sua pergunta foi respondida por favor marque a resposta como certa.
    segunda-feira, 22 de março de 2010 18:57

Respostas

  • Logo depois de postar a pergunta consegui descobrir o que faltava.

    O app.config estava certo, e eu já tinha adicionado corretamente as referencias ao projeto no host.

    O que faltava era colocar o ServiceContract na interface IRepositorioCliente, eu só tinha colocado no IRepositorio, pois pensei que herdando a classe ia ficar com o atributo.

    namespace Dominio.Repositorio
    {
        [ServiceContract]
        public interface IRepositorioCliente: IRepositorio<Cliente>
        {
        }
    }
    

    Saberia me dizer porque ele não reconhece a classe herdada como um serviço tambem?

    Muito obrigado pela resposta Israel. Leio seu blog sempre.

     

     

     

     


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    • Marcado como Resposta Danimar Ribeiro segunda-feira, 22 de março de 2010 19:13
    segunda-feira, 22 de março de 2010 19:07
  • Boas Danimar,

    Não funciona, porque por definição, o atributo ServiceContract não pode ser herdado:

    [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, Inherited=false, AllowMultiple=false)]
    public sealed class ServiceContractAttribute : Attribute
    {
        //...
    }


    http://www.israelaece.com
    • Marcado como Resposta Danimar Ribeiro segunda-feira, 22 de março de 2010 19:13
    segunda-feira, 22 de março de 2010 19:12
    Moderador

Todas as Respostas

  • Boas Danimar,

    Os projetos que você menciona no arquivo de configuração, estão referenciados no projeto que serve como host?


    http://www.israelaece.com
    segunda-feira, 22 de março de 2010 19:01
    Moderador
  • Logo depois de postar a pergunta consegui descobrir o que faltava.

    O app.config estava certo, e eu já tinha adicionado corretamente as referencias ao projeto no host.

    O que faltava era colocar o ServiceContract na interface IRepositorioCliente, eu só tinha colocado no IRepositorio, pois pensei que herdando a classe ia ficar com o atributo.

    namespace Dominio.Repositorio
    {
        [ServiceContract]
        public interface IRepositorioCliente: IRepositorio<Cliente>
        {
        }
    }
    

    Saberia me dizer porque ele não reconhece a classe herdada como um serviço tambem?

    Muito obrigado pela resposta Israel. Leio seu blog sempre.

     

     

     

     


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    • Marcado como Resposta Danimar Ribeiro segunda-feira, 22 de março de 2010 19:13
    segunda-feira, 22 de março de 2010 19:07
  • Boas Danimar,

    Não funciona, porque por definição, o atributo ServiceContract não pode ser herdado:

    [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, Inherited=false, AllowMultiple=false)]
    public sealed class ServiceContractAttribute : Attribute
    {
        //...
    }


    http://www.israelaece.com
    • Marcado como Resposta Danimar Ribeiro segunda-feira, 22 de março de 2010 19:13
    segunda-feira, 22 de março de 2010 19:12
    Moderador
  • Blz valeu.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    segunda-feira, 22 de março de 2010 19:13