如何从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
在服务配置服务中都创建了自复杂类型。
我不知道如何解决这个问题或者是什么原因
我认为它不是这样工作的,特别是当你添加服务引用时。请记住,一旦您添加了服务引用,它就不会在您的客户端引用实际的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