我有一个C#项目,我在其中使用Memento / Command模式来实现撤消/重做功能。该应用程序是一个使用StructureMap for IOC的WPF应用程序,具有广泛的单元测试,并使用RhinoMocks通过接口进行模拟。
在我的代码中,我有一个代表所有可撤消操作的Operation
类,我还有一个IRepositoryWriter
接口,通过该接口路由所有对数据库的写入。
我想知道强制执行仅Operation
及其派生类应该能够使用IRepositoryWriter
的政策的最佳方法是什么。
实现这一目标的显而易见的方法是使IRepositoryWriter
成为Operation
的受保护嵌套接口。
优势:只有Operation
和派生类才能访问IRepositoryWriter
。
缺点:不再可以与StructureMap或Unit Tested一起使用。
对此有哪些其他解决方案?该策略不需要严格强制执行 - 只需足以提示其他在代码库上工作的人就足够了。
答案 0 :(得分:2)
您可以将应用程序划分为多个库,如下所示:
Lib1
UI code
Lib2
Operation and derived classes
Lib3
IRepositoryWriter and implementation
只有Lib2
应该引用Lib3
。您甚至可以使用InternalsVisibleToAttribute
来确保Lib3
的内部组件仅对Lib2
可见,并使IRepositoryWriter
和实施internal
。
这样您仍然可以进行所需的所有单元测试。当然,没有什么可以阻止其他开发人员创建从Lib1
到Lib3
的引用,但这样做更容易实施。
答案 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放入单个程序集中他们自己