【问题标题】:How to return my complex types from a wcf service, not model itself?如何从 wcf 服务返回我的复杂类型,而不是模型本身?
【发布时间】:2015-08-25 07:55:28
【问题描述】:

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

现在,我在我的 mvc 项目中从 myService 添加引用时遇到了一个问题,那就是:

添加我对 myService 的引用后,在 Refrence.cs 中为使用它的每个 myComplex 类型生成自己的复杂类型。

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

DAL

using System.Runtime.Serialization;

namespace DAL
{
    [DataContract]
    public partial class MyComplexType 
    {
        //... 
        [DataMember]
        //my prop
        //...
    }
}

BL

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>();
        }
    }
}

止损

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;
        }
    }
}

Refrence.cs 类在 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 选中和未选中都会创建自我复杂类型。

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

【问题讨论】:

  • 你为什么想要那个?
  • @AmitKumarGhosh,我想使用两种方法,包括服务和业务,并希望同时使用一种复杂类型的 DAL,而不是用于转换类型

标签: c# wcf model-view-controller


【解决方案1】:

我认为它不会那样工作,特别是当您添加服务引用时。请记住,添加服务引用后,它不会在您的客户端中引用实际 DLL

在序列化您的数据合同时,它会重新创建自己的序列化程序可以识别的类,并且仅通过添加命名空间和在服务中反序列化时才重要,它仅检查命名空间以识别服务中实际对象中的等效对象/类:

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

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

查看此链接,了解如何以编程方式创建代理:

【讨论】:

  • 你能解释一下我应该做的更多吗?
  • 如果您要添加服务引用,则无法实现此DAL.MyComplexType result = service.MyServiceMethod(10,12);。如您所见,如果您正在添加服务引用,它会创建新的 MyComplexType。
  • 好的,如何以编程方式创建客户端代理或通道工厂并物理添加您的 DAL?
  • 如果您要添加服务引用,则无法实现DAL.MyComplexType result = service.MyServiceMethod(10,12);。如您所见,如果您正在添加服务引用,它会创建新的 MyComplexType。如果您想在您的客户端中使用您的 DAL.MyComplexType,那么添加服务引用而不是路径。请参阅此链接以创建您的代理 stackoverflow.com/questions/8361646/…,然后在客户端中添加您的 DAL 的引用。
  • 坦克,我已经测试了这两种方法,但在这两种方法中都会生成自己的复杂类型!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2018-06-26
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多