【问题标题】:Make an object accessible to only one other object in the same assembly?使同一程序集中的一个对象只能被另一个对象访问?
【发布时间】:2009-09-15 14:14:31
【问题描述】:

每个业务对象都有一个包含 sql 调用的匹配对象。我想限制这些 sql 对象,使其只能由匹配的业务对象使用。如何实现?

更新

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

【问题讨论】:

    标签: c# .net vb.net accessor


    【解决方案1】:

    如果这是您想要或需要采用的方法,您可以将 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 SqlObject 更改为internal class SqlObject
    • 然后为项目使用[InternalsVisibleTo("UnitTestsAssembly")]

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

    【讨论】:

    • 另外:SqlObject 仍然可以从一个通用类型继承,这样就可以在这些“内部”类之间共享连接信息等内容。
    • 谢谢。我已经在使用部分类进行代码生成。我正在为依赖注入分离 sql​​。您的方法只需要对我的模板进行很少的更改!
    【解决方案2】:

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

    public class BusinessObject
    {
        private class SqlObject
        {
        }
    }
    

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

    【讨论】:

    • 关于可测试性的观点很好。有没有办法做到这一点并将 SqlObject 类公开给单元测试程序集,而不是其他业务对象?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-02
        • 2021-08-06
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多