确保封装的建议

时间:2011-07-21 23:05:17

标签: c# oop encapsulation

在我的解决方案中,我有一个DLL项目,比如Project1,它拥有一个类,比如class A。这个类有一些属性,所以必须只在这个DLL中设置。引用此DLL的任何其他项目只能使用getter。到目前为止,我已经通过内部访问setter处理了这种情况,例如:

public class A
{
  int Num1 
  {
    get; 
    internal set;
  }

  int Num2 
  {
    get; 
    internal set;
  }
} 

现在我必须向解决方案中添加另一个项目Project2,不仅必须使用class A(getter和setter),而且Project1还有一个引用新项目。所以我决定在hierarcy的顶部用不同的定义dll分隔class A。这就是重点,我的问题是araises。现在,Project1Project2都无法看到所有设置者。如果我删除internal访问器,则setter将可用于引用定义dll的任何程序集。我不希望这样,因为class A上的信息非常重要,所以不能错误地设置。

如何限制class AProject1之外Project2的设置者的访问权限?

我想到的只有解决方案是使用InternalsVisibleTo。我不知道,听起来并不完美。同时合并Project1Project2将是另一种解决方案,但这两种解决方案对完全不同的任务负责,它不是设计方面的最佳选择。

3 个答案:

答案 0 :(得分:2)

您可以在其上保留内部保护程序,但为另一个程序集提供信任以访问内部成员。

[assembly: InternalsVisibleTo("AssemblyName")]

您可以在类级别执行此操作,也可以根据需要在整个程序集本身执行此操作。

InternalsVisibleToAttribute Class

答案 1 :(得分:0)

你总是可以做这样的事情(设计的噩梦,但做你要求的):

public class A
{
  int _Num1, _Num2;

  int Num1 {get {return _Num1;}; }
  int Num2 {get {return _Nun2;}; }

  protected void SetNum (int pWhich, int pV)
  {
      if ( pWhich == 1 ) {_Num1 = pV; return;}
      _Num2 = pV;
  } 
} 

然后你可以正常实例化...当你需要设置你使用反射的值时:

myClassA.GetType().GetMethod ("SetNum", BindingFlags.NonPublic ).Invoke (myClassA, new object[] {1, 777 });

答案 2 :(得分:0)

如果我正确地认为Project1做了一些特定的事情,并且Project2是一个抽象,那么这是控制反转的候选者 - 理想情况下,实现应取决于抽象,而不是相反。

如果Project2中的内容需要控制Project1中定义的内容,请在Project2中创建一个接口并让Project2与该接口通信,然后在Project1中实现该接口并在内部完成所有脏工作。

相关问题