C# 在特定情况下实施DI
我试图在类中实现DI,但我不确定我的设计是否合适 我要将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
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);
}