我在Gary McLean Hall的 Adaptive Code via C#的单元测试/测试驱动开发部分。我的问题是基于书中可能包含错误的示例。以下是3层架构中示例splice
的UML图:
我的解决方案分为四个与图层对应的不同项目:User_Interface,Business_Logic,Data_Access和Unit_Tests。
我的问题与AccountService
界面有关。在本书中,作者为伪类(在Unit_Tests项目中)编写了以下代码,用于模拟用于单元测试的IAccountRepository
接口的实现:
IAccountRepository
我遇到的问题是class FakeAccountRepository : IAccountRepository
{
private Account account;
public FakeAccountRepository(Account account)
{
this.account = account;
}
public Account GetByName(string accountName)
{
return account;
}
}
方法返回GetByName()
类型。如果我尝试将Account
中的签名更改为IAccountRepository
返回类型,则无法找到该类型。由于Account
类是业务逻辑层的一部分,如果我尝试添加对Business_Logic项目的引用(来自Data_Access项目),Visual Studio会给我一个“循环依赖”错误。
这是有道理的,因为数据访问层是底层,不应该依赖于它自身之上的任何层......但是没有引用我在Account
接口中不能有Account
返回类型。
作者是否忘记了什么?我应该创建IAccountRepository
界面,更改IAccount
方法以返回GetByName()
类型,并让IAccount
实现Account
界面吗?如果没有,我该如何解决这个问题?
答案 0 :(得分:2)
我在这里看到两种可能性:
答案 1 :(得分:2)
作者很可能将此作为单个可执行文件编写,并将所有内容都放在一个项目中,以便数据访问层可以看到帐户类。
您可以自己完成此操作,只需将“图层”分隔到不同的名称空间即可提供逻辑分离。
答案 2 :(得分:0)
我最终采取了与此处答案不同的方法。我在数据访问层中创建了一个名为IAccount
的接口,并使用IAccount
作为GetByName()
方法的返回类型。这解决了我的问题,仍然保持了分层架构。