3

每个业务对象都有一个包含 sql 调用的匹配对象。我想以一种只能由匹配的业务对象使用的方式限制这些 sql 对象。如何做到这一点?

更新

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

4

4 回答 4

9

如果这是您想要或需要采用的方法,您可以将 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 { }
}

Joel在下面的评论中提出了一个很好的观点,“SqlObject 仍然可以从一个通用类型继承,连接信息之类的东西可以在这些“内部”类之间共享。” 这是绝对正确的,并且可能非常有益。

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

  • 为每个业务/sql 对象对制作一个程序集
  • 更改private class SqlObjectinternal class SqlObject
  • 然后[InternalsVisibleTo("UnitTestsAssembly")]为项目使用

此外,此时您不必将 sql 对象保留为嵌套类。一般来说,我认为这可能会增加比它增加的价值更多的复杂性,但我完全理解每种情况都是不同的,如果你的要求/期望推动你这样做,我祝你好运。就个人而言,我认为我会公开 SqlObjects(或内部对单元测试可见的内部),并接受这意味着 sql 类暴露给所有业务类的事实。

于 2009-09-15T14:16:57.280 回答
4

唯一的方法是使 SQL 对象成为私有嵌套类型,即

public class BusinessObject
{
    private class SqlObject
    {
    }
}

从可测试性的角度来看,这是否是一个好主意完全是另一回事......

于 2009-09-15T14:17:16.510 回答
0

您正在尝试在 C++ 中实现 Friend 类。据我所知,C# 和 VB.Net 没有任何等价物。我唯一的建议是让你希望的类限制需要访问它的类的内部类。

于 2009-09-15T14:20:50.827 回答
0

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

于 2009-09-15T14:28:10.053 回答