我正在开发一个带有sql server的Winforms项目,分成几个程序集。
第一个程序集Entities
包含DTO,如:
public class Attribution
{
public short UserId { get; set; }
public User User { get; set; }
}
public class User
{
public short Id { get; set; }
}
第二个程序集Repository
正在访问Sql Server数据库。
第三个程序集Service
是之前的链接。
还有其他层,但这不是重点。我当然需要DTO在应用程序的任何地方。
在sql server中,Attribution.UserId
和User.Id
是相同的数据,位于2个单独的表中,由Ìnner join
链接。
Attribution.UserId
必须公开,因为我需要从Repository
,Service
等访问...但我不需要它在应用的“逻辑”部分,什么我需要的是Attribution.User
。
目前我有一个UserService
课程,其中有一个GetUser()
方法,我调用此方法让用户使用AttributionService.GetAttribution()
方法。
有没有办法将对Attribution.UserId
属性的访问限制为Service
程序集?或者在User
课程中查询AttributionService
DTO是否是一种“良好做法违规行为”?
非常感谢您的推荐。
`
答案 0 :(得分:3)
一个选项是创建属性set
的{{1}},并使用InternalsVisibleTo
属性授予对Repository程序集内部的访问权限。
另一个技术性较强且逻辑性较强的选项是将setter设为私有,并让它被修改的唯一方法是类构造函数。这样,您的存储库可以构建用户,但是之后没有人可以修改ID。
作为最后一个选项,您可以创建一个仅包含非存储库类应该访问的接口并传递它的接口。我不是一个大粉丝,因为这意味着你必须将它强制转换回存储库中的具体类,这基本上意味着你的存储库正在撒谎(说它接受internal
,但是如果ISomething
则抛出{1}}不是它所期望的具体的ISomething
。