为多层消息对象考虑基类/接口的最佳方式

本文关键字:接口 最佳 方式 基类 消息 对象 | 更新日期: 2023-09-27 18:28:22

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

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

PublicDto {
      Guid userGuid;
      string property1;
      ...
      string propertyN;
 }
PrivateDto {
      AuthenticationTicket authTicket;
      string property1;
      ...
      string propertyN;
 }

是否有一种有效的方法来派生基类或利用这里的接口,从而将私有AuthenticationTicket与公共层屏蔽开来,但最大限度地减少对私有和公共DTO之间区别属性的剪切和粘贴?

为多层消息对象考虑基类/接口的最佳方式

从只声明公共属性的公共基类派生两者

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中派生出private。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>();

您可以创建几个接口和一组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*/ }

现在,如果IOnePrivateIAnyPrivate)需要票证(只有票证),那么您所要做的就是确保内部的东西在它周围传递。同样,如果需要用户(仅用户),则公共内容在IOnePublicIAnyPublic)周围传递。最后,仅根据基数定义的方法仅使用IOneBase