了解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)
             );
}

了解TDD和接口属性

在接口中使用属性是完全可以的,但您的问题实际上主要是构造函数与属性注入,而不是在接口中如何使用属性。

前者(构造函数注入)显然是首选,因为类的依赖项必须在创建时传入,因此它们是清晰可见的,而不是"隐藏的"。就我个人而言,我的目标是始终使用构造函数注入,而属性注入只是最后的手段,例如,当存在无法解决的循环依赖关系时(那时可能最好重新考虑设计)。

我亲自将依赖项注入构造函数,并将它们存储为私有成员。通常,我会发现自己有两个构造函数,一个是应用程序最常用的默认构造函数,另一个是将依赖关系作为参数。我发现这在单元测试中对我有帮助,但也给了我灵活性。