我目前正在开发一个大型Web应用程序,主要包含一个Angular SPA和一个可以访问后端层的OData WebAPI。
我们处于早期阶段并且已经开始实现第一个类,包括位于公共命名空间中的Model.dll
,以便所有层都可以访问它。
我们现在正在讨论模型中的那些DTO。有人说使用接口是绝对必要的,所以代码就像这样:
namespace MySolution.Common.Model
{
public interface IPerson
{
int Id { get; set; }
string Name { get; set; }
...
}
}
namespace MySolution.Common.Model
{
public class PersonDTO : IPerson
{
public int Id { get; set; }
public string Name { get; set; }
...
}
}
就是这样。只是简单的DTO,没有更多的情报 我现在问自己这是不是一个好方法,因为我没有看到在这里使用界面的必要性 这有什么好处?提到了可测试性,但是甚至需要测试DTos吗?依赖注入也应该不是重点 任何启示都会非常有帮助。最后,学习新东西和方法总是很好......
答案 0 :(得分:5)
DTO转移状态 - 就是这样。通过容器注入它们或嘲笑它们进行测试似乎毫无意义(如果这是动机)并且完全没有必要。不要这样做。
答案 1 :(得分:3)
作为一个例子,进一步上面的评论:
Interface IRepo
{
Person GetPerson(int id);
}
Public class DbRepo : IRepo
{
public Person GetPerson(int id){//get person from database}
}
Public class FakeRepo : IRepo
{
public Person GetPerson(int id)
{
return new Person {Id = id, Name = "TestName"};
}
}
您可以使用FakeRepo
和一些模拟对象进行测试。
答案 2 :(得分:0)
在这种情况下,我正在编写一个应该松耦合的api,因为我可以使它的任何部分适应不同的行为,例如更改存储或更改请求中的多个参数,因此可以有另一种行为而不会影响已经存在的行为。
考虑到这一点,为DTO提供一个接口是有效的,因为在另一时间它可以更改其属性以承载更多数据,并且您只需要实现一个抽象,就可以使用此新实现的dto。映射新参数,用于服务中以注册记录。
然后,您将接口(抽象)绑定到dto的新实现以及将要进行修改的位置。
那么,您就不会更改程序的行为,也不会对已经存在的内容进行更改。
因此,您也必须考虑api将会如何。