[ServiceContract]
public interface ISecurities<T> : IPolicyProvider where T: EntityObject
{
[OperationContract(Name="GetAllSecurities")]
IEnumerable<T> GetSecurities();
[OperationContract]
IEnumerable<T> GetSecurities<T1>(List<T1> lstIdentifiers) where T1 : FI_CusipMaster;
[OperationContract]
T GetSecurity<T1>(T1 lstIdentifiers) where T1 : FI_CusipMaster;
}
//Host
///CADIS Contract
ServiceHost dmHost = new System.ServiceModel.ServiceHost(typeof(GlobalInvestors.FIPA.BLL.UDI.CADISSecurities));
Uri baseAddress = dmHost.BaseAddresses[0];
Uri policyAddress = new Uri(baseAddress.AbsoluteUri.Replace(baseAddress.AbsolutePath, ""));
dmHost.AddServiceEndpoint(
typeof(GlobalInvestors.FIPA.BLL.IPolicyProvider),
new System.ServiceModel.WebHttpBinding(),
policyAddress).Behaviors.Add(new System.ServiceModel.Description.WebHttpBehavior());
dmHost.Open();
//App.Config
<service behaviorConfiguration="UDIBehaviour" name="GlobalInvestors.FIPA.BLL.UDI.CADISSecurities">
<endpoint binding="basicHttpBinding" contract="GlobalInvestors.FIPA.BLL.UDI.ICADISSecurities" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:1667/CADIS" />
</baseAddresses>
</host>
</service>
<behavior name="UDIBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
[ServiceContract]
[ServiceKnownType(typeof(SecurityMasterAdapter))]
public interface ICADISSecurities :ISecurities<SecurityMasterAdapter>
{
}
我得到“InvalidDataContractException类型'System.Collections.Generic.List`1 [T1]'无法导出为模式类型,因为它是一个开放的泛型类型。如果它的所有泛型参数类型都只能导出泛型类型是实际的类型。“如果我主持这份合同。
我已经读过在ServiceContract中避免使用泛型是很好的。但是可以使用T吗?
答案 0 :(得分:3)
在这种情况下,您的问题不是ServiceContract中的T而是用作DataContract的T1。如果在服务合同实施期间将T替换为特定类型,则可以在服务合同中使用T.对于数据协定(操作参数和返回类型),您根本不能使用T.您始终必须指定具体类型。可以使用ServiceKnownTypeAttribute重写您的服务合同,以便用FI_CusipMaster替换T1,并且ServiceKnownType指定从FI_CusipMaster派生的所有可能的类。
编辑:另一种方法是不使用ServiceKnownType并使用必须在FI_CusipMaster类型上定义的KnownTypeAttribute。
最好的问候,拉迪斯拉夫
答案 1 :(得分:1)
正如错误所说,不,你不能使用T.服务合同需要能够写出处理确定类型的序列化信息。它无法处理导出函数中的开放泛型
答案 2 :(得分:1)
在您的示例中,T 是泛型类型。您不能在ServiceContract中使用泛型类型,除非它与定义的类型参数一起使用 - 如class Foo : List<int> { }
中所示。