限制对特定程序集的访问
Restrict access to a specific assembly
我正在使用 sql 服务器开发一个 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 服务器数据库。
第三次集会Service
是上次集会link
还有其他层,但这不是重点。我当然需要应用程序中无处不在的 DTO。
在sql服务器中,Attribution.UserId
和User.Id
是相同的数据,位于2个单独的表中,link由Ìnner join
编辑。
Attribution.UserId
必须是 public 因为我需要从 Repository
、Service
等访问...但我不需要它在 "logical"部分应用,我需要的是Attribution.User
.
此时我有一个UserService
class,其中有一个GetUser()
方法,我在我的AttributionService.GetAttribution()
方法中调用这个方法来获取用户。
有没有办法限制 Attribution.UserId
属性 对 Service
程序集的访问?还是在AttributionService
class中查询User
DTO是一种"good practice violation"?
非常感谢您的推荐。
`
一个选项是使 属性 的 set
internal
并使用 InternalsVisibleTo
属性来授予对存储库程序集内部结构的访问权限。
另一个技术性较低但更合乎逻辑的选择是将 setter 设为私有,并让修改它的唯一方法是 classes 构造函数。这样,您的存储库可以构建用户,但以后没有人可以修改 ID。
作为最后一个选项,您可以创建一个接口,该接口仅包含非存储库 classes 应该有权访问和传递的内容。我不是一个忠实粉丝,因为这意味着你必须将它转换回存储库中的具体 class,这基本上意味着你的存储库在撒谎(说它接受 ISomething
,但如果ISomething
不是它期望的准确、具体的 Something
。
我正在使用 sql 服务器开发一个 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 服务器数据库。
第三次集会Service
是上次集会link
还有其他层,但这不是重点。我当然需要应用程序中无处不在的 DTO。
在sql服务器中,Attribution.UserId
和User.Id
是相同的数据,位于2个单独的表中,link由Ìnner join
编辑。
Attribution.UserId
必须是 public 因为我需要从 Repository
、Service
等访问...但我不需要它在 "logical"部分应用,我需要的是Attribution.User
.
此时我有一个UserService
class,其中有一个GetUser()
方法,我在我的AttributionService.GetAttribution()
方法中调用这个方法来获取用户。
有没有办法限制 Attribution.UserId
属性 对 Service
程序集的访问?还是在AttributionService
class中查询User
DTO是一种"good practice violation"?
非常感谢您的推荐。
`
一个选项是使 属性 的 set
internal
并使用 InternalsVisibleTo
属性来授予对存储库程序集内部结构的访问权限。
另一个技术性较低但更合乎逻辑的选择是将 setter 设为私有,并让修改它的唯一方法是 classes 构造函数。这样,您的存储库可以构建用户,但以后没有人可以修改 ID。
作为最后一个选项,您可以创建一个接口,该接口仅包含非存储库 classes 应该有权访问和传递的内容。我不是一个忠实粉丝,因为这意味着你必须将它转换回存储库中的具体 class,这基本上意味着你的存储库在撒谎(说它接受 ISomething
,但如果ISomething
不是它期望的准确、具体的 Something
。