【发布时间】:2018-04-18 18:02:14
【问题描述】:
我经常遇到一个问题,即拥有一个可以完成所有繁重工作的抽象类,然后我有很多多态类可以根据特定需求自定义抽象。抽象一般需要很多参数,所以都得从所有多态类传过来
public class FooComplex : AbstractFoo {
public FooComplex(IBarAwesome awesome, IBarCool cool, ...) : base(IBarAwesome awesome, IBarCool cool, ...) { }
...a lot of overriding abstracts
}
public class FooSimple : AbstractFoo
{
public FooSimple(IBarAwesome awesome, IBarCool cool, ...) : base(IBarAwesome awesome, IBarCool cool, ...) { }
...little bit of overriding abstracts
}
public class AbstractFoo
{
public AbstractFoo(IBarAwesome awesome, IBarCool cool, ...)
...heavy lifting
}
我能做些什么来不通过所有这些东西,但能够对它们进行单元测试?我一直被教导这样做
var awesome = container.Resolve<IBarAwesome>();
就像说构造函数是不好的做法。
我想找到解决方案的原因是,将任何新的东西传递给抽象类变得越来越困难,因为我必须将相同的参数复制并传递给许多多态子类。
【问题讨论】:
-
如果您希望这些参数随时间而变化,一种解决方案是将它们放在
AbstractFooParameters类中,具体类作为单个参数传递。不知道那是不是你要找的。span> -
那可以和 DI 一起使用吗?
-
我不知道 autofac 但它应该与构造函数注入一起使用,就像任何其他构造函数参数一样。
-
我真的很喜欢这个解决方案,你能把它作为答案发布吗?
-
@IanOverton,我同意 C.Evenhuis 解决方案是我对如何解决此问题的最初想法,但是实施很大程度上取决于这些参数的上下文以及您要实现的目标
标签: c# unit-testing dependency-injection autofac