Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否使同一程序集中的另一个对象只能访问某个对象?_C#_.net_Vb.net_Accessor - Fatal编程技术网

C# 是否使同一程序集中的另一个对象只能访问某个对象?

C# 是否使同一程序集中的另一个对象只能访问某个对象?,c#,.net,vb.net,accessor,C#,.net,Vb.net,Accessor,每个业务对象都有一个包含sql调用的匹配对象。我希望限制这些sql对象,使它们只能由匹配的业务对象使用。如何做到这一点 更新 格雷格提出了关于可测试性的观点。因为SqlObjects将包含非常特定于业务流程的sql,所以我不希望在多个buiness对象中重用它们。(基本CRUD操作都是由代码生成的)是否有办法使业务程序集中的一个业务对象(如yshuditelu和Greg Beech所示)只能访问SqlObjects,并将SqlObjects公开给单元测试程序集?如果这是您想要或需要采取的方法,您

每个业务对象都有一个包含sql调用的匹配对象。我希望限制这些sql对象,使它们只能由匹配的业务对象使用。如何做到这一点

更新


格雷格提出了关于可测试性的观点。因为SqlObjects将包含非常特定于业务流程的sql,所以我不希望在多个buiness对象中重用它们。(基本CRUD操作都是由代码生成的)是否有办法使业务程序集中的一个业务对象(如yshuditelu和Greg Beech所示)只能访问SqlObjects,并将SqlObjects公开给单元测试程序集?

如果这是您想要或需要采取的方法,您可以在业务对象中使sql对象成为私有类

public class BusinessObject
{
    private class SqlObject { }
}
此外,通过使用分部类,如果需要,您可以将其分离到单独的文件中

//in one file
public partial class BusinessObject
{
    //business object implementation
}

//in another file
public partial class BusinessObject
{
    private class SqlObject { }
}
在下面的一条评论中提出了一个很好的观点:“SqlObject仍然可以从一个公共类型继承,比如连接信息可以在那些“内部”类之间共享。”这是绝对正确的,并且可能非常有益

为了响应您的编辑,单元测试只能测试公共类和函数(在测试中不使用反射)。我能想到的唯一办法是:

  • 每个业务/sql对象对生成一个程序集
  • 私有类SqlObject
    更改为
    内部类SqlObject
  • 然后对项目使用
    [InternalsVisibleTo(“UnitTestsAssembly”)]

此外,此时您不必将sql对象保持为嵌套类。总的来说,我认为这可能会比它增加的价值增加更多的复杂性,但我完全理解每种情况都是不同的,如果您的需求/期望促使您这样做,我祝您一切顺利。就我个人而言,我认为我应该将SqlObjects公开(或内部具有对单元测试可见的内部构件),并接受这样一个事实,即这意味着sql类将向所有业务类公开。

唯一的方法是将sql对象设为私有嵌套类型,即

public class BusinessObject
{
    private class SqlObject
    {
    }
}

这是否是一个好的想法,从可测试性的角度来看,这完全是另一回事……< /P> < P>你正试图实现C++中的朋友类。据我所知,C#和VB.Net没有任何等价物。我唯一的建议是,将您希望限制的类设置为需要访问它的类的内部类。

您还可以使用两个程序集(一个用于业务对象,一个用于相关SQL对象),并在每个SQL类上使用内部修饰符,然后使用
[InternalsVisibleTo(“BusinessObjectAssembly”)]
用于SQLAssembly。

另外:SqlObject仍然可以从一个公共类型继承,这样连接信息就可以在这些“内部”类之间共享。谢谢。我已经在使用分部类生成代码了。我正在分离sql以进行依赖项注入。您的方法只需要对我的模板进行很少的更改!这是关于可测试性的一个很好的观点。有没有办法做到这一点并将SqlObject类公开给单元测试程序集,而不是其他业务对象?