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>
不起作用
编辑:
ICustomer
和IAssociation
(及其实现(没有任何共同之处。它们不会相互继承任何东西,也没有任何其他共同的依赖关系。
[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 中具有接口类型参数的泛型返回类型