了解TDD和接口属性
本文关键字:属性 接口 TDD 了解 | 更新日期: 2023-09-27 18:28:38
我正在努力更多地理解TDD,我看到的关于DI的所有例子都是只有方法的类/接口,例如
public interface IUserRepository
{
User GetByID(int ID);
}
public class UserRepo : IUserRepository
{
private IUserRepository Repo;
public UserRepo(IUserRepository repo)
{
this.Repo. = repo;
}
public User GetByID(int ID) {}
}
.....
private void SetupDI()
{
container.Register<IUserRepository>.With(UserRepository);
}
我最近开始编写一个带有属性的接口,但由于不确定如何实现这一点而停止了编写。
就DI而言,在接口中具有属性可以吗?设计好吗?
我假设这些属性会像这样注入:
private void SetupDI()
{
var myStringProp = GetPropValue("MyStringProp");
var myIntProp = GetPropValue("MyIntProp");
container.Register<IUserRepository>.With
(
new UserRepository() {
StringProperty = myStringProp;
IntProperty = myIntProp;
}
);
}
或
你会在构造函数中传递所有必需的属性吗:
private void SetupDI()
{
var myStringProp = GetPropValue("MyStringProp");
var myIntProp = GetPropValue("MyIntProp");
container.Register<IUserRepository>.With
(
new UserRepository(myStringProp,myIntProp)
);
}
在接口中使用属性是完全可以的,但您的问题实际上主要是构造函数与属性注入,而不是在接口中如何使用属性。
前者(构造函数注入)显然是首选,因为类的依赖项必须在创建时传入,因此它们是清晰可见的,而不是"隐藏的"。就我个人而言,我的目标是始终使用构造函数注入,而属性注入只是最后的手段,例如,当存在无法解决的循环依赖关系时(那时可能最好重新考虑设计)。
我亲自将依赖项注入构造函数,并将它们存储为私有成员。通常,我会发现自己有两个构造函数,一个是应用程序最常用的默认构造函数,另一个是将依赖关系作为参数。我发现这在单元测试中对我有帮助,但也给了我灵活性。