除了一个集会外,我怎样才能隐藏"setter"?

RPM*_*984 2 .net c# assemblies access-modifiers getter-setter

我的另一个问题中,我已经提到了这个问题,但我认为值得将其分解为自己的问题,因为它并不真正依赖于我提到的其他场景.

无论如何 - 在Q上,不知道这是否可能.寻找解决方案/解决方法.

我有一个类库,只有POCO:

MyCompany.MyProject.Domain.POCO
Run Code Online (Sandbox Code Playgroud)

这个程序集有一个这样的POCO:

public class Post
{
   public int PostId { get; set; }
   public int Name { get; set; }
      ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个类库,它是我的DAL/Repository,并使用Entity Framework 4.0进行持久化:

MyCompany.MyProject.Repositories
Run Code Online (Sandbox Code Playgroud)

这个程序集引用了POCO项目,因为它需要在POCO上执行CRUD操作(抓取DB对象,项目进入POCO,返回,以及修改POCO).

现在,我还有一个Web应用程序,它同时引用了POCO和Repository程序集.

如果我这样做:

somePOCO.PostId = 10;
Run Code Online (Sandbox Code Playgroud)

我得到一个SQLException,因为PostId是数据库中的IDENTITY字段,因此不应该明确设置.

有没有办法可以隐藏这些特殊属性的setter,以便只有存储库可以访问setter?

我想不出用常规辅助功能修饰符来做到这一点的方法(因为它们都不适合这种情况),你们能想到一个解决方法吗?

Luk*_*fer 6

您可以将setter设置为内部,并使内部组件对存储库程序集可见

[assembly: InternalsVisibleTo("MyLibrary.Repositories")]
public class Post
{
   public int PostId { get; internal set; }
   public int Name { get; internal set; }
      ...
}
Run Code Online (Sandbox Code Playgroud)

这意味着一切都可以"获取"这些属性,但只有这个程序集和包含存储库的程序集才能"设置"