Предоставить объекту доступ через Ria Services, реализующий интерфейс.

Вопрос по использованию интерфейсов на презентационных моделях с услугами 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 Services пытается рассматривать интерфейс как единое целое? Как мы можем решить эту проблему?

С уважением,

Стефан


person Stephane    schedule 25.08.2010    source источник


Ответы (2)


Можно использовать интерфейс для класса (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
}
person Jehof    schedule 23.06.2011

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

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

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

person Matt Greer    schedule 25.08.2010
comment
Мне нужен интерфейс как на стороне сервера, так и на стороне клиента. Думаю, я столкнулся с ограничением услуг RIA. - person Stephane; 26.08.2010
comment
Это не ограничение, мы используем интерфейсы в нашей реализации, это класс POCO или EF Generated? - person kmacmahon; 11.09.2010
comment
Ограничение заключается в том, что вы не можете открыть интерфейс из операций запроса. «public IQueryable ‹IMyInt› GetMyInts ()» не поддерживается, в то время как «public IQueryable ‹MyInt› GetMyInts ()» поддерживается. - person Kyle McClellan; 24.06.2011