WCF,为什么让它变得更复杂?

Off*_*ler 9 c# wcf

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

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

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

如果我使用以下内容:

a)定义合同

[ServiceContract]
    public interface IMyContract
    {
        [OperationContract]
        bool DoSomething(string something_in);
    }
Run Code Online (Sandbox Code Playgroud)

b)编程一些代码

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

然后以编程方式托管它

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();
Run Code Online (Sandbox Code Playgroud)

然后从另一个程序中消耗它:

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();
                }
            }
Run Code Online (Sandbox Code Playgroud)

会有什么缺点?

理解不是更容易吗?

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

(我最感兴趣的是,因为我认为使用svcutil非常烦人,所以只是因为类更改,可以简单地手动处理,如果wcf服务仅用于自己的程序的累计)那么什么我错过了吗?

使用大型未读XML文件手动执行操作只是一种不好的风格吗?

Lad*_*nka 3

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

硬编码地址可以吗?

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

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

如果您不希望经常更改它,并且每次更改时都愿意重新编译和重新部署服务器和客户端,则可以对其进行硬编码。API 提供此功能是因为它是有效的用例。

客户端和服务器之间可以共享服务契约和数据契约吗?

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

我自己经常使用带有共享合约程序集的配置=没有 svcutil。

编辑:

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