DTOs и WCF RIA - PullRequest
       306

DTOs и WCF RIA

2 голосов
/ 28 августа 2011

У меня есть DTO, в котором есть коллекция другого DTO, которую я заполняю на стороне сервера и отправляю клиенту.Однако эта внутренняя коллекция DTO не возвращается клиенту.

Я считаю, что мне нужно использовать атрибуты [Include] и [Association], чтобы службы RIA WCF знали, что делать, однако моя проблема с этимнет никакой реальной связи между основным DTO и внутренним набором DTO, я просто использую его для агрегирования данных из различных источников для возврата клиенту.

Неужели мое понимание неверно в том, что я пытаюсьдобиться, если нет, как получить WCF RIA для отправки этой внутренней коллекции DTO.

Я должен добавить, что я использую automapper и хочу добиться этого с помощью такого.

Вот пример,Я хочу отправить обратно клиенту одним фрагментом;

  1. Компетенции, которыми обладает сотрудник.
  2. Компетенции, которые требуются сотруднику для его работы.
  3. Разница между 1 и 2.
public class CompetencyRequirementsDto
{
    [Key]
    public string CompanyId { get; set; }
    [Key]
    public string EmployeeNo { get; set; }

    public string JobId { get; set; }

    [Include]
    [Association("EmployeeCompetencies","CompanyId, EmployeeNo","CompanyId, EmployeeNo")]
    public IList<EmployeeCompetencyDto> EmployeeCompetencies { get; set; }
    [Include]
    [Association("JobCompetencies","JobId, CompanyId","JobId, CompanyId")]
    public IList<JobCompetencyDto> JobCompetencies { get; set; }
    [Include]
    [Association("CompetencyGap", "JobId, CompanyId", "JobId, CompanyId")]
    public IList<JobCompetencyDto> CompetencyGap { get; set; }
} }

Теперь пункт 1 работает нормально, а 2 и 3 - нет?Я обнаружил, что мой DTO создается нормально на стороне сервера, но когда он попадает к клиенту, CompetencyGap (даже если у него нет значений) были заданы значения JobCompetencies.

1 Ответ

0 голосов
/ 17 октября 2011

Если вы используете модель данных ADO.Net Entity и используете RIA Services для них, у вас есть возможность создать связанные метаданные.

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

Here I am giving an example...

1. Just add [Include] attribute at the the top of  the referenced data for example.

[MetadataTypeAttribute(typeof(Customer.CustomerMetadata))]
    public partial class Customer
    {

        // This class allows you to attach custom attributes to properties
        // of the Customer class.
        //
        // For example, the following marks the Xyz property as a
        // required property and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal sealed class CustomerMetadata
        {

            // Metadata classes are not meant to be instantiated.
            private CustomerMetadata()
            {
            }

            public int CustomerID { get; set; }

            public string EmailAddress { get; set; }

            public string FullName { get; set; }

            [Include]
            public EntityCollection<Order> Orders { get; set; }

            public string Password { get; set; }
        }
    }


2. Modify the function in the domain service and add include there also for example. 

     public IQueryable<Customer> GetCustomers()
        {
             var res = this.ObjectContext.Customers.Include("Orders");
             return res;
        }

  In your case the first part is done you just need to modify your domain service query to get reference entities.
...