Универсальный сервисный интерфейс - PullRequest
4 голосов
/ 03 июня 2011

У меня есть универсальный сервисный интерфейс:

[ServiceContract]
public interface IService<T> where T : Class1
{
    [OperationContract]
    void DoWork(T class1);
}

Тогда у меня есть конкретная служба, которая наследуется от этого:

public class Service : IService<Class1>
{
    public void DoWork(Class1 class1)
    {
    }
}

Все работает нормально, пока я не добавлю webHttpEndpoint для предоставления JSON WS:

<service name="Service">
    <endpoint 
        address="" 
        binding="webHttpBinding" 
        behaviorConfiguration="webHttpBehavior"
        contract="IService"  />
</service>

<behavior name="webHttpBehavior">
    <enableWebScript />
</behavior>

На самом деле я получаю эту ошибку:

Название контракта 'IService' не может быть найденным в списке контрактов реализуется сервисом «Сервис».

Это из-за общего определения интерфейса. Любое решение?

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

На мой взгляд (и исходя из того, что вы сказали), интерфейс не должен быть универсальным. Вызывающий просто должен знать, что есть операция DoWork.

Так что, в принципе, измените конкретный класс на общий вместо интерфейса.

public class Service<T> : IService where T : Class1
{
    public void DoWork()
    {
    }
}

РЕДАКТИРОВАТЬ после уточнения вопроса: Вам также необходимо указать общий параметр в файле конфигурации:

contract="YourAssembly.IService`1[[YourAssembly.Class1, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"

Вот аналогичный вопрос: Наследование от родового договора в WCF

2 голосов
/ 03 июня 2011

Вы должны правильно вписать имя типа вашего контракта в конфигурацию.IService - это не имя IService<Class1> !!!

Конфигурация должна выглядеть следующим образом:

<service name="Service">
    <endpoint 
        address="" 
        binding="webHttpBinding" 
        behaviorConfiguration="webHttpBehavior"
        contract="IService`1[Class1]"  />
</service>

<behavior name="webHttpBehavior">
    <enableWebScript />
</behavior>

Имейте в виду, что если ваш контракт или служба находятся в каком-либо пространстве имен, пространства именбыть включенным в конфигурацию.

Или в случае необходимости полных имен:

<service name="Namespace.Service, AssemblyName">
    <endpoint 
        address="" 
        binding="webHttpBinding" 
        behaviorConfiguration="webHttpBehavior"
        contract="Namespace.IService`1[[Namespace.Class1, AssemblyName]], AssemblyName"  />
</service>

<behavior name="webHttpBehavior">
    <enableWebScript />
</behavior> 
0 голосов
/ 03 июня 2011

Где ваш Class1 ..... Вместо указания какого-либо конкретного класса сделайте его ссылочным типом, используя class

Попробуйте что-нибудь такое ...

 [ServiceContract]public interface IService<T> where T : class
    { 
       [OperationContract] 
       void DoWork();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...