【问题标题】:Sending an Interface definition over the wire (WCF service)通过网络发送接口定义(WCF 服务)
【发布时间】:2009-05-19 02:47:26
【问题描述】:

我有一个 WCF 服务,它生成负载实体框架对象(以及用于减轻负载的一些其他结构和简单类)并将它们发送到客户端应用程序。

我已经更改了 2 个类来实现一个接口,以便我可以在我的应用程序中将它们作为单个对象类型引用。很像这个例子: Is it Possible to Force Properties Generated by Entity Framework to implement Interfaces?

但是,接口类型没有添加到我的 WCF 服务代理客户端 thingymebob,因为它没有在通过网络发送回的对象中直接引用。

因此,在我使用服务代理类的应用程序中,我无法转换或引用我的接口..

任何想法我错过了什么?

下面是一些示例代码:

//ASSEMBLY/PROJECT 1 -- EF data model

namespace Model
{
    public interface ISecurable
    {
        [DataMember]
        long AccessMask { get; set; }
    }

    //partial class extending EF generated class
    //there is also a class defined as "public partial class Company : ISecurable"
    public partial class Chart : ISecurable
    {
        private long _AccessMask = 0;
        public long AccessMask
        {
            get { return _AccessMask; }
            set { _AccessMask = value; }
        }

        public void GetPermission(Guid userId)
        {
            ChartEntityModel model = new ChartEntityModel();
            Task task = model.Task_GetMaskForObject(_ChartId, userId).FirstOrDefault();
            _AccessMask = (task == null) ? 0 : task.AccessMask;
        }
    }
}

//ASSEMBLY/PROJECT 2 -- WCF web service
namespace ChartService
{
    public Chart GetChart(Guid chartId, Guid userId)
    {
         Chart chart = LoadChartWithEF(chartId);
         chart.GetPermission(userId); //load chart perms
         return chart; //send it over the wire
    }
}

【问题讨论】:

  • 您在客户端中使用的是服务引用还是 Web 引用?是否从项目 2 中引用项目 1?我相信服务引用会默认重用引用类型。
  • 我没有直接在我的客户端应用程序中引用来自服务应用程序的类型。我之前曾考虑过这样做,但决定在两个应用程序之间保持隔离以最大程度地减少依赖性。如果我要包含对 EF/WCF 项目的引用,我不妨将其编写为一个应用程序。

标签: wcf entity-framework interface partial-classes


【解决方案1】:

接口不会在您的 WSDL 中作为单独的实体出现 - 它们只会将其方法和属性添加到公开它们的对象中。

您可以使用抽象类来完成您想要完成的任务。这些将作为不同的实体出现。

祝你好运。让我们知道您决定如何继续。

【讨论】:

  • 你是对的,这个问题没有答案。实体框架部分不能从抽象类(或任何不属于同一实体模型的类)继承。所以在我的模型中,我仍然使用接口来保持我的结构排序,但在我的客户端应用程序中,我只是使用反射来检查属性(只有 2 个)并盲目地发送对象。如果将无效的对象参数传递给它,WCF 服务方法无论如何都会失败......没什么大不了的。干杯。