【问题标题】:how to use your same Domain entities throug a .Net webservice?如何通过 .Net Web 服务使用相同的域实体?
【发布时间】:2009-02-27 07:27:14
【问题描述】:

如果您有一个在客户端中引用的实体和这样的网络服务

public class Post
{    
        public int ID {get; set;}
        string Data {get; set;}
}



 public class MyService: System.Web.Services.WebService
 {   
         [WebMethod]
         public int Write (Post post)
         { 
               //Do stuff

         }
 }

在客户端上,以便使用您从代理类实例化的实体

   public void ClientMethod()
      {
         var post = new proxyclass.Post();
         //fill post
         new ProxyClass.Myservice().Write(post) 

       }

如何使用我的域实体来调用网络服务?

 public void ClientMethod()
          {
             var post = new Post();
             //fill post
             new ProxyClass.Myservice().Write(post) 

           }

【问题讨论】:

    标签: c# .net web-services casting


    【解决方案1】:

    基本上,您不能 - 使用常规的 Web 服务,至少……代理类是完全独立的。但是,上述 可以通过 WCF 实现,您实际上根本不需要代理类(但是,对于 SOA 纯度而言,使用它们是一个好主意)。

    您可以使用反射(等)在您的域实体和代理之间复制属性,但是很难做到 100% 正确(尽管 xml 序列化应该 [理论上]作为一种中间语言)。


    所以;如果你想使用程序集共享;考虑使用支持此功能的 WCF;-p

    要在不使用代理层的情况下获取服务,您可以使用以下技巧:

    public class WcfClient<T> : ClientBase<T> where T : class
    {
        public T Service { get { return base.Channel; } }
    }
    

    (这将从 app.config 访问默认配置;为了获得更多控制,您需要添加一些与基本构造函数重载匹配的构造函数重载)

    然后:

    interface IFoo {void Bar();}
    ...
    using(WcfClient<IFoo> client = new WcfClient<IFoo>()) {
        client.Service.Bar();
    }
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      您应该尽可能使用 WCF 进行新开发。

      但是,您应该重新考虑您希望在客户端上使用您的域类的原因。通过向客户端公开服务实现的一些细节,它确实违反了 SOA 的原则。除了实体类包含的数据之外,客户为什么还要知道有关您的实体类的任何信息?

      例如,您的实体类可能包含将实体保存到数据库的方法。为什么您的客户需要访问该方法?

      此外,SOA 的原则之一是与不同平台进行互操作。一旦您要求您的客户端使用您的 (.NET) 实体,您就会阻止编写 Java 或 PHP 客户端来使用您的服务。

      您可能有足够充分的理由来克服这些反对意见,但我建议您仔细考虑并确保您的理由足够充分。

      【讨论】:

        【解决方案4】:

        对于这种情况,您最好使用 json 向 Web 服务发送和接收数据。
        Newtonsoft.json 是 .Net 的最佳 json 序列化程序。所以你应该改变你的 Write 方法,如下所示:

        public void ClientMethod()
              {
                 var post = new Post();
                 //fill post
                 new ProxyClass.Myservice().Write(JsonConvert.SerializeObject(post)) 
        
               }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-14
          • 2016-11-09
          • 1970-01-01
          • 2013-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多