假设我有一个使用WCF服务进行幕后处理的Web项目,以及一个处理Web请求的MVC 2项目(我想这将是WCF客户端)。 WCF服务生成数据并处理预生成的数据(处理可能异步发生)。这两件事是视觉工作室中同一解决方案中的独立项目。
现在,我不确定在何处放置代表服务生成内容的数据结构,以及客户端需要处理并发送给用户浏览器的内容。目前,他们都在服务的界面(端点界面?不确定它的确切名称)标有[DataContract]
(不确定那是什么)。但是,由于MVC应用程序是在一个单独的项目中,我必须重新定义那里的所有数据结构 - 这是必要的吗?我应该将这些结构放在解决方案的其他地方吗?界面变得非常充满了类定义 - 我是否能够创建某种包含项目之间共享数据结构的共享资源?那个[DataContract]
部分怎么样?如果在其他地方定义了类,我还是需要以某种方式填充接口吗?
道歉,如果我不是很有意义或非常模糊。我之前从未使用过这些微软技术,所以我还是迷失了。我就是在学习的时候。
答案 0 :(得分:4)
我喜欢这样构建我的WCF解决方案:
合同(类库)
包含所有服务,操作,故障和数据协定。可以在纯.NET到.NET方案中在服务器和客户端之间共享。这是您放置数据结构类的地方,以便生态系统中的所有项目都可以使用它。
服务实施(类库)
包含实现服务的代码,以及实现此目的所需的任何支持/帮助程序方法。没别了。
服务主机(可选 - 可以是Winforms,Console App,NT Service)
包含用于调试/测试的服务主机,或者也可能用于生产。
这基本上给了我服务器方面的东西。
在客户端:
客户端代理(类库)
我喜欢将我的客户端代理打包到一个单独的类库中,以便它们可以被多个实际的客户端应用程序重用。这可以使用svcutil或“添加服务引用”并手动调整生成的可怕的app.config,或者通过使用ClientBase<T>
或ChannelFactory<T>
构造手动实现客户端代理(共享契约程序集时)来完成
1-n个实际客户(任何类型的应用)
通常只会引用客户端代理程序集,或者也可能引用契约程序集(如果它正在共享)。这可以是ASP.NET,WPF,Winforms,控制台应用程序,其他服务 - 您可以命名。
这是受到Miguel Castro的Extreme WCF screen cast在DotNet Rocks电视上与Carl Franklin的启发 - 强烈推荐的屏幕演员!
答案 1 :(得分:2)
将您的数据对象放在另一个单独的项目中(在创建它时选择类库)并从WCF和MVC2引用它们(除了复制之外,我认为不可能让它工作)。 / p>
[DataContract]
必须用于装饰数据对象类,无论它们在何处。
我不清楚你说“DataContract部分怎么样 - 我还需要以某种方式在界面中填充”...你能提供一些示例代码吗?
作为参考,这里是我过去参与的项目的一些代码:
这是项目Server.Contracts
:
namespace Server.Contracts.DataContracts.Mapped
{
using System;
using System.Runtime.Serialization;
[DataContract]
public class ConfigSetting : BindableDataContract
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Value { get; set; }
[DataMember]
public DateTime ModifiedOn { get; set; }
public override object Clone()
{
return new ConfigSetting
{
ModifiedOn = this.ModifiedOn,
Name = this.Name,
Value = this.Value,
};
}
}
}
这也在Server.Contracts
:
namespace Server.Contracts.ServiceContracts
{
using System;
using System.Net.Security;
using System.ServiceModel;
using Common.Constants.ServiceModel;
using Common.LogClient;
/// <summary>
/// Interface that defines the log service contract.
/// </summary>
[ServiceContract(
Name = ServiceContract.LogServiceName,
Namespace = ServiceContract.LogServiceNamespace,
ProtectionLevel = ProtectionLevel.None,
SessionMode = SessionMode.NotAllowed)]
public interface ILogService
{
[OperationContract(Name = "Deferred", IsOneWay = true)]
void Deferred(LogSeverity severity, DateTime eventTimeUtc, string actor,
uint? deviceId, string message, string stackTrace);
}
}
这个项目是从这两个项目中引用的,其中包括:
ILogService
已实施)