【问题标题】:.NET: same entity class between Web and Web Service are conflict?.NET:Web 和 Web Service 之间的同一实体类是否冲突?
【发布时间】:2014-04-25 08:21:27
【问题描述】:

这是我的解决方案结构,有 3 个项目

.NET 3.5 与 Visual Studio 2010 环境
1.库项目,用于定义普通类(只有属性,没有任何方法)名称为“实体”
2. Web 应用项目名称为“MyWeb”
3. Web服务项目名称为“MyServices”


问题
我在“实体”中定义消息类

namespace MyUtil
{
    public class Message
    {
        public int Key { get; set; }
        public string Message { get; set; }
        public object Value { get; set; }
    }
}

这是从“MyWeb”调用网络服务方法的代码。

MyServices service = new MyServices();
MyUtil.Message message = service.GetMessage();

我无法编译。它仍然是通知错误
无法将 MyUtil.Message 转换为 MyWe.MyWebService.Message

所以这里是工作代码

MyServices service = new MyServices();
MyWeb.MyWebService.Message message  = service.GetMessage();

问题是我无法使用 MyWeb.MyWebService.Message(来自 Web 服务的返回值)将数据传递到另一个 Web 方法。

所以我需要知道,如何在 Web 和 Web 服务之间使用相同的实体类。不能互相施放。这很难用,有什么办法解决吗?

对于我最近的研究,我发现我必须将所有实体定义为共享类型,这里如何
http://technico.qnownow.com/how-to-share-objects-types-between-multiple-web-services/
我已经尝试了很多次,并且在输出文件夹上没有任何类。有没有人发现这个问题?以及如何解决它。

期待帮助,谢谢。

【问题讨论】:

  • 我猜您使用的是“老派”网络服务?在这种情况下,当您引用 Web 服务时,Visual Studio 会为您生成与您在 WebService 项目中使用的不同的代理类。如果您没有太多对象,您可以尝试使用 Automapper 映射它们。
  • 是的,我使用的是老式网络服务。我的项目中有 200 多个类,所以如果我使用自动映射器,下一个问题是我的服务器内存不够用。新的网络服务版本会帮助我解决这个问题吗?
  • 课程的数量不会增加你的记忆力。但是活动对象的数量会。我看不出内存有什么大问题。我不是 WCF(新 Web 服务版本)的专家,所以我不知道它是如何解决的。但是我用 Web.API 做了一个项目。这很好用,因为数据作为 Json 传输,我会使用 Json.NET 将数据序列化/反序列化到我的公共类中。
  • 谢谢,我是这么认为的。我将尝试使用 json 发送/接收数据,这是个好主意。非常感谢

标签: c# asp.net .net web-services class


【解决方案1】:

所以这是将属性值从一个对象克隆到另一个对象的代码(如果名称相同,您还可以检查属性的类型)

public TCloned CloneProperties<TSource, TCloned>(TSource sourceObj)
{
    var propertoiesToClone = typeof(TCloned).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
    var clonedInstance = (TCloned)Activator.CreateInstance(typeof(TCloned));

    var sourceProperties = typeof(TSource).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);

    foreach (var prop in propertoiesToClone)
    {
        var appropriatePropery = sourceProperties.SingleOrDefault(p => p.Name == prop.Name);

        if (appropriatePropery != null)
        {
            prop.SetValue(clonedInstance, appropriatePropery.GetValue(sourceObj));
        }
    }

    return clonedInstance;    
}

并像这样使用它

MyUtil.Message message = CloneProperties<MyWeb.MyWebService.Message, MyUtil.Message>(service.GetMessage())

【讨论】:

    【解决方案2】:

    您可以在 MyWeb.MyWebService.Message 中定义一个隐式/显式运算符,允许您将类型从一个转换为另一个。 如果我们假设您的其他类型看起来相同,您可以这样说:

    public static explicit operator MyUtil.Message(MyWeb.MyWebService.Message other)
    {
          return new MyUtil.Message
          {
              Key = other.Key,
              Message = other.Message,
              Value = other.Message
          };
    }
    

    然后只需转换您的类型:

    MyUtil.Message message = (MyUtil.Message)service.GetMessage();
    

    如果您使用隐式而不是显式运算符,您也可以摆脱强制转换。 但我不建议这样做,因为它可能会在程序的未来产生混淆。 当然最简单的方法就是写一个转换函数。

    【讨论】:

    • 或者您可以只创建一个通用方法并将一个对象的属性复制到另一个具有相同名称的对象的新实例中,这样您就不必写出该类具有的所有属性并且该代码可以在以后重复使用
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多