限制对特定程序集的访问

时间:2017-11-24 08:30:49

标签: c# .net design-patterns .net-assembly

我正在开发一个带有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.UserIdUser.Id是相同的数据,位于2个单独的表中,由Ìnner join链接。

Attribution.UserId必须公开,因为我需要从RepositoryService等访问...但我不需要它在应用的“逻辑”部分,什么我需要的是Attribution.User

目前我有一个UserService课程,其中有一个GetUser()方法,我调用此方法让用户使用AttributionService.GetAttribution()方法。

有没有办法将对Attribution.UserId属性的访问限制为Service程序集?或者在User课程中查询AttributionService DTO是否是一种“良好做法违规行为”?

非常感谢您的推荐。

`

1 个答案:

答案 0 :(得分:3)

一个选项是创建属性set的{​​{1}},并使用InternalsVisibleTo属性授予对Repository程序集内部的访问权限。

另一个技术性较强且逻辑性较强的选项是将setter设为私有,并让它被修改的唯一方法是类构造函数。这样,您的存储库可以构建用户,但是之后没有人可以修改ID。

作为最后一个选项,您可以创建一个仅包含非存储库类应该访问的接口并传递它的接口。我不是一个大粉丝,因为这意味着你必须将它强制转换回存储库中的具体类,这基本上意味着你的存储库正在撒谎(说它接受internal,但是如果ISomething则抛出{1}}不是它所期望的具体的ISomething