1

使用 C#、ASP.NET、MVC、WCF 时,假设您有一个非公共业务逻辑服务层,并且出于安全和其他此类原因,您有一个公开公开相同操作的网关或外观层。

因此,您有两个具有基本相同数据传输(请求/响应)对象的层,除了公共/公开服务层需要处理代表调用用户的 GUID,而私有/内部服务层需要处理更丰富的身份验证票。此身份验证票证不得暴露给公共层。

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

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

是否有一种有效的方法来派生基类或在此处利用接口,以便将私有 AuthenticationTicket 与公共层屏蔽,但最大限度地减少私有和公共 DTO 之间区分属性的剪切和粘贴?

4

2 回答 2

1

两者都派生自一个仅声明公共属性的公共基类

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

public class PublicDto : BaseDto {
      Guid userGuid;
}

private class PrivateDto : BaseDto {
      AuthenticationTicket authTicket;
}

更新:

一种完全不同的方法是以通用方式处理属性,如果由于序列化而这是一种可行的方式。

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 派生私有。Guid 在私有 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>();
于 2012-03-20T23:22:31.477 回答
1

您可以制作几个接口和一组 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)。最后,仅根据 base 定义的方法仅使用IOneBase.

于 2012-03-20T23:42:56.293 回答