如何在WCF服务中将接口作为参数传递?

5

我有以下代码,但不确定这是否是正确的做法。

namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [ServiceKnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

这是使用接口的代码。
namespace WCFServices
{
    public class Service : IService
    {
        public void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states)
        {
            Process.ExecuteAll(name, data, modules, states);
        }
    }
}

目前我唯一的对象类型是以下内容。

namespace DataObjects
{
    [Serializable]
    [DataContract]
    public class DataItem : IDataItem
    {
        public DataItem();

        [DataMember]
        public CustomerInfo customer { get; set; }

        [DataMember]
        public LoanInfo loan { get; set; }

        [DataMember]
        public DateTime loanProcessingDate { get; set; }

        [DataMember]
        public string moduleID { get; set; }

        [DataMember]
        public string processingState { get; set; }
    }
}

我是否朝着正确的方向前进?


你究竟想要实现什么?参数是做什么用的? - Jerrington
WCF服务接受4个参数,其中一个是IDataItem接口类型。我需要告诉服务哪种对象使用了该接口,对吗? - Tyler Buchanan
这里涉及的唯一接口是 IEnumerable<T>, IDataItemIService。你具体指的是什么? - Codor
在这篇文章中找到了答案...http://stackoverflow.com/questions/7213083/using-class-interface-as-a-parameter-in-wcf-service - Tyler Buchanan
3个回答

2

您需要使用KnownTypeAttribute而不是ServiceKnownTypeAttribute。


好的,我应该把这个注解放在哪里?就像我的答案一样吗? - Tyler Buchanan
我认为如果您将其放在IService的顶部,它应该可以工作。但通常我会将其放在IDataItem的顶部以获得更好的封装性。 - papadi

1
如果问题中涉及的接口是您的IDataItem,它在IEnumerable<IDataItem>参数中使用,则需要将接口本身标记为已知类型:
[KnownTypeAttribute(typeof(IDataItem))]

请查看此博客:http://blogs.msdn.com/b/domgreen/archive/2009/04/13/wcf-using-interfaces-in-method-signatures.aspx

编辑:正如papadi正确指出的那样,应该使用KnownTypeAttribute而不是ServiceKnownTypeAttribute。

编辑2:

namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [ServiceKnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

namespace DataObjects
{
    [DataContract]
    [KnownType(typeof(IDataItem))]
    public class DataItem : IDataItem
    {
        ...
    }
}

好的,我应该把这个注解放在哪里?比如下面这样? - Tyler Buchanan
@TylerBuchanan,是的,你自己的答案看起来是正确的。那不起作用吗?你有收到任何错误信息吗? - Jerrington
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tyler Buchanan

0
你是指像下面这样吗?
namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [KnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

我的对象仍然看起来像这样。

namespace DataObjects
{
    [DataContract]
    [Serializable]   <------ Not having this was my problem
    [KnownType(typeof(IDataItem))]
    public class DataItem : IDataItem
    {
        public DataItem();

        [DataMember]
        public CustomerInfo customer { get; set; }
        [DataMember]
        public LoanInfo loan { get; set; }
        [DataMember]
        public DateTime loanProcessingDate { get; set; }
        [DataMember]
        public string moduleID { get; set; }
        [DataMember]
        public string processingState { get; set; }
    }
}

这是我的接口

namespace Interfaces
{
    public interface IDataItem
    {
        CustomerInfo customer { get; set; }
        LoanInfo loan { get; set; }
        DateTime loanProcessingDate { get; set; }
        string moduleID { get; set; }
        string processingState { get; set; }
    }
}

1
抱歉,我撤回之前的话,你的答案并不完全正确。在你的服务声明中,你需要使用 ServiceKnownTypeAttribute 而不是 KnownTypeAttributeDataItem 类已经标记正确)。 - Jerrington
填写了一个SoapUI请求服务的表单,除了数据参数之外,我得到了所有内容。列表为空。 - Tyler Buchanan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接