数据结构在哪里属于WCF应用程序?

时间:2010-12-24 09:32:52

标签: c# wcf

假设我有一个使用WCF服务进行幕后处理的Web项目,以及一个处理Web请求的MVC 2项目(我想这将是WCF客户端)。 WCF服务生成数据并处理预生成的数据(处理可能异步发生)。这两件事是视觉工作室中同一解决方案中的独立项目。

现在,我不确定在何处放置代表服务生成内容的数据结构,以及客户端需要处理并发送给用户浏览器的内容。目前,他们都在服务的界面(端点界面?不确定它的确切名称)标有[DataContract](不确定那是什么)。但是,由于MVC应用程序是在一个单独的项目中,我必须重新定义那里的所有数据结构 - 这是必要的吗?我应该将这些结构放在解决方案的其他地方吗?界面变得非常充满了类定义 - 我是否能够创建某种包含项目之间共享数据结构的共享资源?那个[DataContract]部分怎么样?如果在其他地方定义了类,我还是需要以某种方式填充接口吗?

道歉,如果我不是很有意义或非常模糊。我之前从未使用过这些微软技术,所以我还是迷失了。我就是在学习的时候。

2 个答案:

答案 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);
    }
}

这个项目是从这两个项目中引用的,其中包括:

  • 客户端
  • Server.Implementation(例如ILogService已实施)
相关问题