通过实现接口的Ria Services公开对象

时间:2010-08-25 15:27:01

标签: c# silverlight interface wcf-ria-services

关于使用带有RIA服务的presentationModels上的接口的问题。

可以通过实现接口的Ria Services公开对象吗?

界面:

public interface TestInterface
{
    public int ID {get;set;}
}

我们有一个presentationModel:

public class TestPresentationModel : TestInterface
{
   [Key]
   public int ID {get;set;}
}

我现在收到编译错误: DomainService“SomeDomainService”中的实体“TestInterface”没有定义键。 DomainService操作公开的实体必须至少有一个使用KeyAttribute标记的公共属性。

我尝试添加[Key]属性,但后来出现以下错误: 派生实体类型'TestPresentationModel'必须在根实体'TestInterface'的KnownTypeAttribute中声明。

我尝试添加[KnownTypeAttribute]属性,但后来出现以下编译错误: 属性“KnownType”在此声明类型上无效。它仅对'class,struct'声明有效。

似乎Ria服务试图将接口视为一个实体?我们怎样才能克服这个问题?

问候,

的Stephane

2 个答案:

答案 0 :(得分:4)

可以在服务器和客户端使用您需要的类(viewModel)接口。为此,您需要与接口实现共享接口和部分viewmodel类。

在您的情况下,您需要在服务器项目中定义类和文件:

文件:ITestInterface.shared.cs

public interface TestInterface{
  public int ID {get;set;}
}

文件:TestPresentationModel.cs

public partial class TestPresentationModel {
  [Key]
  public int ID {get;set;}
}

文件:TestPresentationModel.ITestInterface.shared.cs

public partial class TestPresentationModel : ITestInterface {
   // can be empty cause the interface implementation is in TestPresentation.cs
}

答案 1 :(得分:0)

一种可能性是让客户端实体实现此接口。这就是我所做的。将文件添加到与实体位于同一名称空间的Silverlight应用程序中,然后只扩展实体(它们都在部分类中定义):

namespace My.Model.Namespace
{
    public partial class TestPresentationModel : TestInterface
    {
        ...
    }
}

然后只有你的客户端实体有这个界面,所以这可能不是你拍摄的,但它对我来说效果很好。