如何从wcf服务返回我的复杂类型,而不是模型本身

本文关键字:模型 类型 复杂 wcf 服务 我的 返回 | 更新日期: 2023-09-27 18:09:52

我有一个单独的层用于我的复杂类型DataAccessLayer (DAL),以及一个单独的层用于业务BusinessLogicLayer (BL)。我创建了一个wcf服务应用项目ServiceLayer (SL),并添加了使用BL方法和DAL复合类型作为返回值的服务。

现在,我有一个问题在添加参考从myService在我的mvc项目,它是:

当我添加myService的引用时,在references .cs中为每个使用它的myComplex类型生成自己的复杂类型

我不想生成自己的复杂类型和使用我的复杂类型在DAL。

木豆

using System.Runtime.Serialization;
namespace DAL
{
    [DataContract]
    public partial class MyComplexType 
    {
        //... 
        [DataMember]
        //my prop
        //...
    }
}

提单

namespace BL
{
    public partial class MyRepository
    {
        public List<DAL.MyComplexType> MyMethod(int param1,int param2) 
        {
            var parameters= new List<SqlParameter>();
            parameters.Add(new SqlParameter("Param1",SqlDbType.Int){ Value = param1 });
            parameters.Add(new SqlParameter("Param2",SqlDbType.Int){ Value = param2 });
            var result = DAL.RunProcedure("MyProc", parameters);
            return result.ConvertToList<DAL.MyComplexType>();
        }
    }
}

SL

namespace SL
{
    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        List<DAL.MyComplexType> MyServiceMethod(int param1,int param2);
    }
}
namespace SL
{
    public class MyService : IMyService
    {
        public List<DAL.MyComplexType> MyServiceMethod(int param1, int param2) 
        {
            BL.MyRepository bl = new BL.MyRepository();
            List<DAL.MyComplexType> result = bl.MyMethod(param1, param2);
            return result;
        }
    }
}

references .cs class In MyMvcProject添加MyService引用服务后:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34014
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MyMvcProject.MyService
{
    using System.Data;
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName = "MyService.IMyService")]
    public interface IMyService
    {
        [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IMyService/MyServiceMethod", ReplyAction = "http://tempuri.org/IMyService/MyServiceMethodResponse")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        MyMvcProject.MyService.MyServiceMethodResponse MyServiceMethod(MyMvcProject.MyService.MyServiceMethodRequest request);
        // CODEGEN: Generating message contract since the operation has multiple return values.
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMyService/MyServiceMethod", ReplyAction="http://tempuri.org/IMyService/MyServiceMethodResponse")]
        System.Threading.Tasks.Task<MyMvcProject.MyService.MyServiceMethodResponse> MyServiceMethodAsync(MyMvcProject.MyService.MyServiceMethodRequest request);
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.33440")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/DAL")]
    public partial class MyComplexType : object {
        //private props ...
        //..
        /// <remarks/>
        //public props
    }
    //.... other bloks
}

使用的服务引用方法的返回类型为 MyMvcProject.MyService.MyComplexType

MyMvcProject.MyService.MyServiceClient service = new MyMvcProject.MyService.MyServiceClient();
MyMvcProject.MyService.MyComplexType result = service.MyServiceMethod(10,12);

代替:

DAL.MyComplexType result = service.MyServiceMethod(10,12);

如何解决?有什么问题吗?

我的vs版本是2013。

我在WPF项目中对该方法进行了测试,结果ok,这意味着服务不创建自复型而从DAL复型使用。

但是在MVC项目中,无论是选中还是未选中,Reuse types in refrenced assemblies在服务配置服务中都创建了自复杂类型。

我不知道如何解决这个问题或者是什么原因

如何从wcf服务返回我的复杂类型,而不是模型本身

我认为它不是这样工作的,特别是当你添加服务引用时。请记住,一旦您添加了服务引用,它就不会在您的客户端引用实际的DLL

在序列化你的数据契约时,它重新创建自己的类,序列化器只能通过添加名称空间来识别,并且在服务中反序列化时,它只检查名称空间以识别服务中实际对象中的等效对象/类:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/DAL")]
    public partial class MyComplexType : object {
       . . . 
    }

如果你想在客户端使用你自己的DAL,为什么不直接创建客户端代理或通道工厂编程和物理添加你的DAL。

看一下如何以编程方式创建代理的链接:

  • 创建不自动生成代理的WCF客户端
  • https://msdn.microsoft.com/en-us/library/ms734681%28v=vs.110%29.aspx