为多层消息对象考虑基类/接口的最佳方式
本文关键字:接口 最佳 方式 基类 消息 对象 | 更新日期: 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*/ }
现在,如果IOnePrivate
(IAnyPrivate
)需要票证(只有票证),那么您所要做的就是确保内部的东西在它周围传递。同样,如果需要用户(仅用户),则公共内容在IOnePublic
(IAnyPublic
)周围传递。最后,仅根据基数定义的方法仅使用IOneBase
。