在特定情况下实施DI

时间:2012-03-09 23:55:39

标签: c# dependency-injection inversion-of-control

我正在尝试在课堂上实施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);
   }
}

在这种情况下,我只是不知道如何实现DI。也许GetActiveDoers方法设计不好?否则你会把这种方法放在哪里?

直接在存储库中添加新方法是一个好习惯吗?有些人告诉我它应该保持干净,所以它只实现了这个

public interface IDoerRepository
{
    IQueryable<Doer> Doers { get; }
    void SaveDoer(Doer doer);
    void DeleteDoer(Doer doer);
}

2 个答案:

答案 0 :(得分:2)

听起来你需要将DoerRepository基本注入DoerValidation - 将其传递给构造函数。

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

答案 1 :(得分:1)

静态方法和属性本质上是程序性的。如果您静态公开GetActiveDoers()方法,则无法注入其功能 - 客户端只能忽略它或在任何需要的地方使用它。

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