今天我有一个关于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服务仅用于自己的程序的累积,可以手动简单处理) 那我错过了什么?
使用大型未读XML文件手动执行操作只是一种不好的风格吗?
答案 0 :(得分:3)
您的问题可以分为多个部分:
硬编码地址可以吗?
NO。以同样的方式我们不硬编码连接字符串,我们也不硬编码资源或服务的路径(至少不是绝对路径)。您永远不知道何时需要根据任何原因更改它 - 例如测试新版本的服务。如果您不想使用完整端点配置,请至少使用简单的应用设置。
硬编码绑定和配置是否可以?
如果您不希望经常更改它,并且如果您对每次更改它时重新编译和重新部署服务器和客户端感到满意,那么您可以对其进行硬编码。 API提供此功能是因为它是有效的用例。
在客户端之间共享服务合同和数据合同是否可行 和服务器?
同样,这取决于您对应用程序增长的预期方式以及您希望部署的复杂程度。如果您完全控制客户端和服务器代码,则共享程序集是有效的用例,但您必须记住,它会在您的服务器和客户端应用程序之间引入紧密耦合。 Svcutil是一个工具,它可以帮助您从无法控制的SOAP服务(您没有自己的代码或不是用.NET编写)生成客户端,也可以用于您希望与服务器松散耦合的客户端。
我经常使用配置共享合同程序集自己=没有svcutil。
编辑:
无论如何,在XML配置的编码配置中没有技术缺陷(某些高级配置甚至在XML中不可用)。如果开发人员知道WCF,他就会理解XML和代码。如果开发人员不了解WCF,他可能会对代码更满意,因为XML配置可能会暂时隐藏起来。
答案 1 :(得分:1)
以编程方式执行此操作应该可以正常工作。如果您想要更改某些内容,或者最终用户需要更改某些内容,则会出现主要问题。 如果端点地址或其他配置发生变化,则不必重新编译代码就容易得多。
我想说使用配置文件会更好,这样设置就会保存在一个单独的地方,并且在需要时很容易找到。
如果您有充分的理由想要将其隐藏起来(例如,您不希望他们看到它/弄乱它),我只会选择对配置进行硬编码。