在WCF客户端中使用引用的复杂类型

时间:2016-06-23 11:24:06

标签: c# wcf interface datacontract

我是C#的新手,我在WCF应用程序中遇到DataMember问题:

有问题的DataMember是实现接口的类的实例列表,让我们在“assemblyA”中调用此类“classA”,实现“interfaceA”。

通过WCF从服务器传递到客户端的“主”数据对象(具有此DataMember)被定义为“classB”,位于程序集“assemblyB”中,在服务器和客户端中都引用它。

AssemblyB 对assemblyA的反对。到目前为止一切都很好。

现在客户端(在“assemblyC”中)连接到通过WCF传递assemblyB DataContract对象的服务,但是asseblyC没有对assemblyA的引用(并且不应该有!)。一切都还可以,序列化和反序列化工作正常,但是:

当我尝试在assemblyC中使用 classA对象时,C#抱怨它不知道类型。

有没有办法在不引用assemblyA的情况下将interfaceA导入assemblyC?我尝试在C中定义一个继承自intefaceA(“interfaceCA”)的接口并转换为assemblyC中的接口......但是没有运气,C#仍然抱怨缺少对assemblyA的引用。

我无法将interfaceA从assemblyA移动到assemblyB,因为assemblyA必须在没有对assemblyB的引用的情况下工作,并且我不想在assemblyC中引用assemblyA,因为assemblyC甚至不应该知道assemblyA ...除了那个数据成员。 据我所知,在C#中,我无法强制转换为assemblyB中定义的interfaceA的副本 ...所以,任何人都知道如何将它传递给assemblyC?

让我们为您提供一个简单的伪代码片段用于演示目的:

// assemblyA

public interface iA
{
    string Stuff { get; }
}

[DataContract]
public class A : iA
{
    [DataMember]
    public string Stuff { get { return "Stuff"; } }
}
// assemblyB, references assemblyA

[DataContract]
public class B
{
    [DataMember]
    public int Num { get; protected set; }

    [DataMember]
    public List<A> StuffContainers { get; protected set; }
}
// assemblyC, references assemblyB

public class C
{
    public void ReceiveData(B data)
    {
        Console.WriteLine(data.Num); // all fine

        // the following line shows an error
        foreach (var stuffContainer in data.StuffContainers)
        {
            Console.WriteLine(stuffContainer.Stuff);
        }

        // same here, of course since C# can't resolve namespaceA and/or iA
        foreach (namespaceA.iA stuffContainer in data.StuffContainers)
        {
            Console.WriteLine(stuffContainer.Stuff);
        }

        // same here of course
        List<namespaceA.iA> sC = (List<namespaceA.iA>)data.StuffContainers;
        foreach (namespaceA.iA stuffContainer in sC)
        {
            Console.WriteLine(stuffContainer.Stuff);
        }
    }
}

希望这足以说清楚......这是我自己的第一个问题! ;)

0 个答案:

没有答案