9

今天我有一个关于 WCF 通信风格的问题。

我有时会拒绝一点,所以以编程方式使用东西(想要控制自己)而且我不喜欢巨大的东西。有时需要两个程序部分之间的通信,有时在同一台机器上,有时在网络上。

所以我尝试以编程方式使用 WCF,而不是使用配置文件、svcutil 等。

如果我使用以下内容:

a) 定义合同

[ServiceContract]
    public interface IMyContract
    {
        [OperationContract]
        bool DoSomething(string something_in);
    }

b) 编写一些代码

public class MySomething: IMyContract
        {
            public bool DoSomething(string something_in)
            {
                if(String.IsNullOrEmpty(something_in)
                      return false;
                return true;
            }
}

然后以编程方式托管它

Uri baseAddress = new Uri("net.tcp://localhost:48080/MySimpleService");

            using (ServiceHost host = new ServiceHost(typeof(MyContract), baseAddress))
            {
                host.AddServiceEndpoint(typeof(IMyContract), new NetTcpBinding(), "");
                host.Open();

                Console.WriteLine("<Enter> to stop the service.");
                Console.ReadLine();

                host.Close();

然后从另一个程序中使用它:

var binding = new NetTcpBinding();
            var endpoint = new EndpointAddress("net.tcp://localhost:48080/MySimpleService");
            var channelFactory = new ChannelFactory<IMyContract>(binding, endpoint);

            IMyContract client = null;

            try
            {
                client = channelFactory.CreateChannel();
                bool test = client.DoSomething();
                ((ICommunicationObject)client).Close();
            }
            catch (Exception ex)
            {
                if (client != null)
                {
                    ((ICommunicationObject)client).Abort();
                }
            }

有什么缺点?

不是更容易理解吗?

这样的事情会引起其他问题吗?

(我对此最感兴趣,因为我认为使用 svcutil 非常烦人,所以一个只是因为类更改,如果 wcf 服务仅用于自己程序的 cumminication,则可以简单地手动处理)那又如何我失踪了吗?

手动处理大型未读 XML 文件只是一种糟糕的风格吗?

4

2 回答 2

3

您的问题可以分为多个部分:

硬编码地址可以吗?

不。同样,我们不会硬编码连接字符串,我们也不会硬编码资源或服务的路径(至少不是绝对路径)。您永远不知道何时出于任何原因需要更改它 - 例如测试服务的新版本。如果您不想使用完整的端点配置,请至少使用简单的应用程序设置。

硬编码绑定和配置可以吗?

如果您不希望经常更改它,并且如果您对每次更改它时重新编译和重新部署服务器和客户端感到满意,您可以对其进行硬编码。API 提供了这一点,因为它是有效的用例。

在客户端和服务器之间共享服务合同和数据合同可以吗?

同样,这取决于您期望应用程序如何增长以及您期望部署的复杂性如何。如果您可以完全控制客户端和服务器代码,则共享程序集是有效的用例,但您必须记住它会在服务器和客户端应用程序之间引入紧密耦合。Svcutil 是一种工具,可帮助您从您无法控制的 SOAP 服务(您没有它们的代码或它们不是用 .NET 编写)或您希望与服务器进行松散耦合的客户端生成客户端。

我自己经常将配置与共享合同程序集一起使用 = 没有 svcutil。

编辑:

无论如何,与 XML 配置相比,编码配置没有技术缺陷(某些高级配置甚至在 XML 中不可用)。如果开发人员了解 WCF,他将同时了解 XML 和代码。如果开发人员不了解 WCF,他可能会对代码更满意,因为 XML 配置可能暂时对他隐藏。

于 2013-01-09T13:22:42.037 回答
1

以编程方式执行此操作应该可以正常工作。当您想要更改某些内容或最终用户需要更改某些内容时,就会出现主要问题。如果端点地址或其他配置发生变化,则不必重新编译代码会容易得多。

我会说使用配置文件会更好,这样设置会保存在单独的位置,并且在需要时很容易找到。

如果您有充分的理由想要对用户隐藏它(例如,您不希望他们看到它/弄乱它),我只会选择硬编码配置。

于 2013-01-09T13:13:10.007 回答