Лучший способ учитывать базовый класс / интерфейс (ы) для многоуровневых объектов сообщений? - PullRequest
1 голос
/ 21 марта 2012

Работая с C #, ASP.NET, MVC, WCF, предположим, что у вас есть непубличный уровень службы бизнес-логики, а по соображениям безопасности и другим подобным причинам у вас есть слой шлюза или фасада, который публично предоставляет те же операции.

Таким образом, у вас есть два уровня с практически идентичными объектами передачи данных (запрос / ответ), за исключением того, что уровень открытых / открытых сервисов должен иметь дело с GUID, представляющим вызывающего пользователя, и уровень частных / внутренних сервисов должениметь дело с более богатым билетом аутентификации.Этот билет проверки подлинности не должен быть доступен общедоступному уровню.

PublicDto {
      Guid userGuid;
      string property1;
      ...
      string propertyN;
 }

PrivateDto {
      AuthenticationTicket authTicket;
      string property1;
      ...
      string propertyN;
 }

Существует ли эффективный способ получения базового класса или использования здесь интерфейсов таким образом, чтобы защитить частный AuthenticationTicket от общедоступного уровня, номинимизировать сокращение и вставку разграничительных свойств между частными и публичными DTO?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Вы можете создать несколько интерфейсов и один набор DTO, а затем просто убедиться, что правильный интерфейс - это то, что вы передаете.

public interface IAnyPublic { Guid user; }
public interface IAnyPrivate { AuthenticationTicket ticket; }
public interface IOneBase { int foo; string goo; }
public interface IOnePublic : IOneBase, IAnyPublic { } // nothing to add, sir!
public interface IOnePrivate : IOneBase, IAnyPrivate { } // nothing to add, sir!
public class OneBase : IOnePublic, IOnePrivate { /*implement*/ }

Теперь все, что вам нужно сделать, - это убедиться, что ваши внутренние данные проходят.около IOnePrivate (IAnyPrivate), если ему нужен билет (только билет).Точно так же общедоступный материал проходит вокруг IOnePublic (IAnyPublic), если ему нужен пользователь (только пользователь).Наконец, методы, определенные в терминах только основы, используют только IOneBase.

1 голос
/ 21 марта 2012

Извлечь оба из общего базового класса, объявляющего только общие свойства

public abstract class BaseDto {
    string property1;
    ...
    string propertyN;
} 

public class PublicDto : BaseDto {
      Guid userGuid;
}

private class PrivateDto : BaseDto {
      AuthenticationTicket authTicket;
}

UPDATE:

Совершенно другой подход заключается в том, чтобы обрабатывать свойства общим образом, если это возможно из-за сериализации.

public class PublicDto {
      public Guid userGuid { get; set; }
      public Dictionary<string,string> Prop { get; }

      public PublicDto ()
      {
          Prop = new Dictionary<string,string>();
      }
}

Использование

dto = new PublicDto();
Prop["FirstName"] = "John";
Prop["LastName"] = "Doe";

ОБНОВЛЕНИЕ № 2

1

Вы могли бы просто получить личное от публичного dto. Гид останется неиспользованным в частном порядке.

2

Универсальное решение

public class Dto<T> {
    public T ID { get; set; }

    string property1;
    ...
    string propertyN;
} 

var publicDto = new Dto<Guid>();
var privateDto = new Dto<AuthenticationTicket>();
...