C# 在特定情况下实施DI

C# 在特定情况下实施DI,c#,dependency-injection,inversion-of-control,C#,Dependency Injection,Inversion Of Control,我试图在类中实现DI,但我不确定我的设计是否合适 我要将DI添加到的类中的相关代码 class DoerValidation { public DoerValidation() { compileData(); } private void compileData() { doersActive = Doer.GetActiveDoers(); //... } } 在我的Doer课上 public partial

我试图在类中实现DI,但我不确定我的设计是否合适

我要将DI添加到的类中的相关代码

class DoerValidation 
{
   public DoerValidation()
   {
       compileData();
   }

   private void compileData()
   {
       doersActive = Doer.GetActiveDoers();
       //...
   }
}
在我的
Doer
课上

public partial class Doer
{
   private static readonly DoerRepository repository = new DoerRepository();

   public static IEnumerable<Doer> GetActiveDoers()
   {
       return repository.Doers.Where(c => c.Person.IsActive);
   }
}

听起来您需要将
DoerRepository
注入
DoerValidation
基本上-将其传递到构造函数中


GetActiveDoers
和静态变量都违反了DI、IMO的原则。

静态方法和属性本质上是过程性的。如果静态地公开GetActiveDoers()方法,则无法注入其功能——客户机只能忽略它或在需要时内联使用它


如果您致力于DI和静态实现,则需要为该静态类编写实例包装器并注入实例包装器。

感谢您的帮助。你能不能详细介绍一下在这种情况下,什么是原则?+1表示“反对DI原则”。非常同意。@Mathieu:
DoerValidation
依赖于一个
DoerRepository
,有效地:所以通过将它传递到构造函数来注入它。将
GetActiveDoers
作为实例方法放在
DoerRepository
本身上,或者在必要时将其作为扩展方法。
public interface IDoerRepository
{
    IQueryable<Doer> Doers { get; }
    void SaveDoer(Doer doer);
    void DeleteDoer(Doer doer);
}