使一个班级仅适用于其他一个班级

时间:2010-08-18 10:25:49

标签: c# design-patterns

我有一个C#项目,我在其中使用Memento / Command模式来实现撤消/重做功能。该应用程序是一个使用StructureMap for IOC的WPF应用程序,具有广泛的单元测试,并使用RhinoMocks通过接口进行模拟。

在我的代码中,我有一个代表所有可撤消操作的Operation类,我还有一个IRepositoryWriter接口,通过该接口路由所有对数据库的写入。

我想知道强制执行Operation及其派生类应该能够使用IRepositoryWriter 的政策的最佳方法是什么。

实现这一目标的显而易见的方法是使IRepositoryWriter成为Operation的受保护嵌套接口。

优势:只有Operation和派生类才能访问IRepositoryWriter

缺点:不再可以与StructureMap或Unit Tested一起使用。

对此有哪些其他解决方案?该策略不需要严格强制执行 - 只需足以提示其他在代码库上工作的人就足够了。

5 个答案:

答案 0 :(得分:2)

您可以将应用程序划分为多个库,如下所示:

Lib1
    UI code
Lib2
    Operation and derived classes
Lib3
    IRepositoryWriter and implementation

只有Lib2应该引用Lib3。您甚至可以使用InternalsVisibleToAttribute来确保Lib3的内部组件仅对Lib2可见,并使IRepositoryWriter和实施internal

这样您仍然可以进行所需的所有单元测试。当然,没有什么可以阻止其他开发人员创建从Lib1Lib3的引用,但这样做更容易实施。

答案 1 :(得分:1)

  

政策不需要严格执行 - 只要足以暗示其他人在代码库上工作就足够了

/// <summary>
///    blah blah, what this interface is for
/// </summary>
/// <remarks>
///   This interface should only be implemented by inheritors of Operation.
/// </remarks>
public interface IRepositoryWriter{}

为您说明明显的解决方案。 ;)

答案 2 :(得分:1)

如何用一个将Operation作为参数的构造函数替换IRepositoryWriter和RepositoryWriter呢?

答案 3 :(得分:0)

在这种情况下可能有点过分但如果你绝对必须遵守DRY原则,你可以编写一些脚本来仅改变需要接口的.cs文件 - 脚本可以读取一个只是一个类列表的文件被允许实现接口。这样,您可以将接口嵌套在使用它的每个类中,包括单元测试,而不需要任何重复的知识。当然,缺点是你引入了一个全新的复杂程度。

事后看来,可能弊大于利,因为你可以添加评论来警告其他开发者你正在做什么,但至少对你的问题有不同的看法。

答案 4 :(得分:0)

内部关键字将对类的访问限制为单个程序集中的元素,即在程序集外部看不到内部类 - 将Operation,Operation子类和IRepositoryWriter放入单个程序集中他们自己