John Whitmire Ответов: 0

Унаследованный интерфейс создает дубликат объявления метода в метаданных DLL


Сценарий довольно запутанный, но, возможно, этого урезанного резюме будет достаточно, чтобы направить меня в правильном направлении.
У меня есть служба, которая предоставляет данные для моего приложения. WCF используется для обеспечения взаимодействия между ними. У меня также есть отладочная версия службы, которую я использую для предоставления сгенерированных тестовых данных приложению. Отладочная версия копирует весь связанный с WCF код и данные конфигурации, повторно используя библиотеки DLL, из которых построена служба. Служба работает, как и подключение WCF к ней. Отладочная версия начинает работать, но не может установить соединение WCF, жалуясь, что два метода в одном контракте имеют одно и то же имя.
Основная задействованная архитектура такова:
using System.ServiceModel;

namespace nsOne
{
    [ServiceContract]
    public interface IFoobarOne
    {
        [OperationContract] void FooOne(string str);
        [OperationContract] void BarOne(string str);
    }
}

namespace nsTwo
{
    [ServiceContract(/*...*/)]
    public interface IFoobarTwo : nsOne.IFoobarOne
    {
        [OperationContract] void FooTwo(int number);
        [OperationContract] string BarTwo();
    }

    public abstract class One<T> : nsOne.IFoobarOne
    {
        public virtual void FooOne(string str) { /*...*/ }
        public virtual void BarOne(string str) { /*...*/ }
    }

    public interface IOther { /*...*/ }

    [ServiceBehavior(/*...*/)]
    public class BeOne : One<IOther>, IFoobarTwo
    {
        public BeOne() { /*...*/ }

        public void FooTwo(int number) { /*...*/ }
        public string BarTwo() { /*...*/ return "me"; }
    }
}

namespace nsThree
{
    public class Something<T> where T: class, nsOne.IFoobarOne
    {
        protected T proxy;

        protected void DoSome()
        {
            proxy.FooOne("abc");
        }
    }

    public class SomethingMore : Something<nsTwo.IFoobarTwo>
    {
        private void DoMore()
        {
            DoSome();
            proxy.FooTwo(2);
        }
    }
}

namespace nsFour
{
    [ServiceBehavior(/*...*/)]
    public class BeOneToo : nsTwo.One<nsTwo.IOther>, nsTwo.IFoobarTwo
    {
        public BeOneToo(object param) { /*...*/ }

        public void FooTwo(int number) { /*...*/ }
        public string BarTwo() { /*...*/ return "you"; }
    }
}
В терминах этого примера служба строит BeOne использование объекта:
serviceHost = new ServiceHost(typeof(BeOne));
В приложении, SomethingMore объект успешно обращается к объекту и манипулирует им (через WCF) . BeOne объект на службе.
Пространство имен nsOne, nsTwo, и nsThree содержатся в одном и том же растворе VS.
Пространство имен nsFour содержит отладочную версию службы. Библиотеки DLL для других пространств имен включены по ссылке, но их проекты не входят в это решение VS. Объекты WCF создаются с помощью:
var objBeOneToo = new BeOneToo(this);
serviceHost = new ServiceHost(objBeOneToo);
Когда он запускается, объект успешно создается, но ServiceHost конструкция выбрасывает исключение, жалуясь, что есть два метода контракта с именем BarOne Если я посмотрю на определения IFoobarOne и IFoobarTwo что IntelliSense происходит от метаданных DLL, конечно же, оба включают объявление для BarOne, но только IFoobarOne содержит декларацию для FooOne.
Я в недоумении. Почему это происходит IFoobarTwo DLL правильно указывает на IFoobarOne.FooOne, но не для того, чтобы IFoobarOne.BarOne? Как мне это исправить?

Что я уже пробовал:

Смотреть Ошибка: не может быть двух операций в одном контракте с одним и тем же именем[^], но он не решает эту проблему.

0 Ответов