关于控制(IoC)的反转是如何工作的,我有点困惑Spring.
假设我有一个名为的UserServiceImpl实现UserService接口的服务类.
怎么会这样@Autowired?
而在我Controllers,我怎么会instantiate在instance这个服务的?
我会做以下吗?
UserService userService = new UserServiceImpl();
Run Code Online (Sandbox Code Playgroud) 我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;
我的问题基本上是我应该使用Ninject 2做IoC,考虑到......
我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:
有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......
谢谢!
Autofac自动生成工厂Func<T>; 我甚至可以传递参数.
public class MyClass
{
public MyClass(Func<A> a, Func<int, B> b)
{
var _a = a();
var _b = b(1);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以和Ninject一样吗?如果没有,我可以申请哪种解决方法?
谢谢.
更新:
刚发现这篇帖子,似乎答案是否定的:
所以我想知道单元测试在处理外部依赖关系方面是如何工作的.在这里和其他地方,我已经熟悉依赖注入,以及它如何允许我们测试代码的单元(A).但是,我对如何测试现在具有外部依赖性的其他单元(B和C)感到困惑,因此他们可以将它注入原始单元(A).
例如,假设一些类Foo使用外部依赖...
class Foo
{
private ExternalDependency ed;
public int doSomethingWithExternalDependency() {...}
}
Run Code Online (Sandbox Code Playgroud)
而且Bar使用Foo ...
class Bar
{
public int doSomethingWithFoo
{
Foo f = new Foo();
int x = f.doSomethingWithExternalDependency();
// Do some more stuff ...
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我知道我可以使用依赖注入,以便我可以测试Foo,但是我如何测试Bar?我想,我可以再次使用依赖注入,但在某些时候某些单元需要实际创建外部依赖; 那我该怎么测试那个单位呢?
我有以下课程(部分内容):
class SearchViewModel : BaseViewModel<SearchResultItem>
{
private readonly IDownloader _downloader;
public SearchViewModel( IDownloader downloader)
: base(model)
{
_downloader = downloader;
}
private void Download(object sender, DoWorkEventArgs e)
{
_downloader.Download(item);
}
}
Run Code Online (Sandbox Code Playgroud)
我为IDownloader使用了构造函数注入,并且在多线程出现之前它已经运行良好.
_downloader有一个状态,我需要在单独的线程中运行_downloader.Download(item)(用户单击搜索结果页面上的下载按钮).
目标:之前_downloader.Download(item),_downloader应初始化一个新实例.我可以使用_container.Resolve(IDownloader),但它会破坏组合根原则.
我已经创建了讨论最佳解决方案的问题,因为我认为直接初始化(new())或对容器的引用不是答案.
假设我有一个BaseForm依赖于一个ILogger或IResourceManager或类似的东西.目前,它使用服务定位器解决了所需服务的正确实现,我知道这是一种反模式.
BaseForm在容器中注册my (及其'派生类型)才能创建具有已解析依赖项的实例?这不是一切都复杂化吗?很抱歉一次提出很多问题.我已经阅读了以下SO问题和许多其他问题,但阅读它们只会增加我的困惑:
dependency-injection anti-patterns ioc-container inversion-of-control service-locator
ninject ×2
asp.net-mvc ×1
autofac ×1
autowired ×1
c# ×1
func ×1
java ×1
spring ×1
spring-mvc ×1
unit-testing ×1