Выставить объект через Ria Services, который реализует интерфейс - PullRequest
2 голосов
/ 25 августа 2010

Вопрос о использовании интерфейсов на PresentationModels со службами RIA .

Возможно выставить объект через Ria Services, который реализует интерфейс ?

Интерфейс:

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

У нас есть презентационная модель:

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

Теперь я получаю ошибку компиляции: у объекта 'TestInterface' в DomainService 'SomeDomainService' не определен ключ.Объекты, предоставляемые операциями DomainService, должны иметь хотя бы одно открытое свойство, помеченное KeyAttribute.

Я пытался добавить атрибут [Key], но затем я получаю следующую ошибку: должен быть объявлен тип производного объекта «TestPresentationModel»в атрибуте KnownTypeAttribute корневого объекта «TestInterface».

Я попытался добавить атрибут [KnownTypeAttribute], но затем я получаю следующую ошибку компиляции: Атрибут «KnownType» недопустим для этого типа объявления.Он действителен только для объявлений 'class, struct'.

Кажется, службы Ria пытаются трактовать интерфейс как сущность?Как мы можем преодолеть эту проблему?

С уважением,

Стефан

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Возможно использовать интерфейс для класса (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
}
0 голосов
/ 25 августа 2010

Одна возможность состоит в том, чтобы ваши объекты на стороне клиента реализовали этот интерфейс.Это то, что я сделал.Добавьте в приложение Silverlight файл, который находится в том же пространстве имен, что и ваши сущности, а затем просто расширьте сущности (все они определены в частичных классах):

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

Тогда только интерфейс на стороне клиента имеет этот интерфейс, так что это может быть не то, что вы стреляете, но это хорошо сработало для меня.

...