WCF 具有接口和泛型模型

本文关键字:泛型 模型 接口 WCF | 更新日期: 2023-09-27 18:34:14

关于

WCF 中的接口和泛型,SO 上有很多问题,但我找不到一个指向与我相同的问题的问题。

我有一项有合同的服务:

[ServiceContract]
[ServiceKnownType(typeof(CollectionWrapper<IAssociation>))]
public interface IService : 
{
    [OperationContract]
    ICollectionWrapper<IAssociation> FindAssociation(string name, int pageSize, int page);
}
public interface ICollectionWrapper<TModel>
{
    int TotalCount { get; set; }
    IEnumerable<TModel> Items { get; set; }
}
[KnownType(typeof(OrganizationDto))]
[KnownType(typeof(CompanyDto))]
public class CollectionWrapper<TModel> : ICollectionWrapper<TModel>
{
    [DataMember]
    public int TotalCount { get; set; }
    [DataMember]
    public IEnumerable<TModel> Items { get; set; }
}
public class CompanyDto :  IAssociation
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class OrganizationDto :  IAssociation
{
    public int Id { get; set; }
    public string Name { get; set; }
}

它与ChannelFactory<IService>一起使用,上面的代码效果很好。但是现在我想向服务添加另一个方法,它也返回ICollectionWrapper<T> .

[OperationContract]
ICollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);

所以我像注册另一个一样注册它:

[ServiceContract]
[ServiceKnownType(typeof(CollectionWrapper<IAssociation>))]
[ServiceKnownType(typeof(CollectionWrapper<ICustomer>))] // This line creates the error.
public interface IService : 
{
    [OperationContract]
    ICollectionWrapper<IAssociation> FindAssociation(string name, int pageSize, int page);
    [OperationContract] // New method.
    ICollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);
}
[KnownType(typeof(OrganizationDto))]
[KnownType(typeof(CompanyDto))]
[KnownType(typeof(CustomerDto))] // New model.
public class CollectionWrapper<TModel> : ICollectionWrapper<TModel>
{
    [DataMember]
    public int TotalCount { get; set; }
    [DataMember]
    public IEnumerable<TModel> Items { get; set; }
}

一旦我有两个ServiceKnownTypes CollectionWrapper服务就会失败并显示以下错误:

基础连接已关闭:上发生意外错误 a 接收。

而内部的例外:

远程主机强行关闭了现有连接。

我可以在这两行代码之间切换(删除一行,然后添加另一行(:

[ServiceKnownType(typeof(CollectionWrapper<ICustomer>))]
[ServiceKnownType(typeof(CollectionWrapper<IAssociation>))]

然后每个方法都有效,但绝不会同时工作。知道如何让它工作吗?我不想使用具体的类。

这是我尝试过的(但失败了(:

[ServiceKnownType(typeof(CollectionWrapper<object>))]
[ServiceKnownType(typeof(CollectionWrapper<>))]

我还尝试为IAssociation和ICustomer分配一个通用接口,但它也没有奏效。

[ServiceKnownType(typeof(CollectionWrapper<ISomething>))]

它对IEnumerable<T>IList<T>都很好用,但对我的ICollectionWrapper<T>不起作用

编辑:

ICustomerIAssociation(及其实现(没有任何共同之处。它们不会相互继承任何东西,也没有任何其他共同的依赖关系。

WCF 具有接口和泛型模型

[OperationContract]
ICollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);

服务如何知道 ISearchQuery 参数存在哪些已知类型?

我认为您需要将[KnownType(typeof(SearchQuery))](或任何调用ISearchQuery实现的内容(添加到服务定义中。

经过大量研究,我无法找到一个好的解决方案,但我想我会发布我最终得到的解决方案(即使它没有按照我想要的方式解决它(

[ServiceContract]
[ServiceKnownType(typeof(CompanyDto>))]
[ServiceKnownType(typeof(CompanyDto>))]
[ServiceKnownType(typeof(CustomerDto))]
[ServiceKnownType(typeof(OrganizationDto))]
public interface IService : 
{
    [OperationContract] // Concrete type
    CollectionWrapper<IAssociation> FindAssociation(string name, int pageSize, int page);
    [OperationContract] // Concrete type
    CollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);
}

它只是通过使用具体类而不是接口来解决的。这不是我真正想要的,但现在它解决了我的问题。

此处可能重复:

WCF 中具有接口类型参数的泛型返回类型