使用C#/ Autofac /起订量:我有这个类:如何嘲笑Autofaq接口,起订量
public class MyService
{
private readonly IlifetimeScope _scope;
public MyService(ILifetimeScope scope)
{
_scope = scope;
}
public void DoWork()
{
var dbContext = _scope.Resolve<IDataContext>();
}
}
此工程在运行时。但是,我不能单元测试它,因为我不能模拟Resolve()方法。这是一种扩展方法。
能够嘲笑它的最佳方式是什么?显而易见的事情是将IDataContext注入到构造函数中而不是ILifetimeScope中,但出于各种原因我不能。
那么,它会工作,而不是注入一个Func?
public class MyService
{
private readonly Func<IDataContext> _dbContext;
public MyService(Func<IDataContext> dbContext)
{
_dbContext = dbContext;
}
public void DoWork()
{
var ctxt = _dbContext();
// do stuff
}
}
如在:我可以嘲笑它,但Autofac会弄清楚如何将正确的参数注入ctor?还是有更好/更简单的方法来做到这一点?
我很好奇使用构造函数注入的“各种原因你不能使用”,这导致你使用服务定位器反模式。你已经承认这是一种可能性,但为什么不通过这些问题来解决问题,而不是试图找到解决方法(可能甚至不需要引用Autofac)?我觉得有必要考虑一下如果删除对DI容器的引用会发生什么情况 - 如果在组成根目录之外的任何内容会中断,如果你这样做,你可能会紧密耦合到容器。 – NightOwl888
不要嘲笑范围,只是把模拟的东西放在里面。 –