Dependency injection 国际奥委会还有多远

Dependency injection 国际奥委会还有多远,dependency-injection,inversion-of-control,Dependency Injection,Inversion Of Control,我想知道我的IoC实现在松散耦合的应用程序方面应该走多远。我在MVC控制器中使用构造函数注入,但不知道是否也应该在控制器中解析所有其他依赖项,而不是更新对象。例如,如果我要在控制器方法中创建一个新的用户对象,我会使用吗 var user = new User(); var user = myContainer.Resolve<IUser>(); var user=new user(); var user=myContainer.Resolve(); 我喜欢打破对用户依赖的想法,但

我想知道我的IoC实现在松散耦合的应用程序方面应该走多远。我在MVC控制器中使用构造函数注入,但不知道是否也应该在控制器中解析所有其他依赖项,而不是更新对象。例如,如果我要在控制器方法中创建一个新的用户对象,我会使用吗

var user = new User();
var user = myContainer.Resolve<IUser>();
var user=new user();
var user=myContainer.Resolve();

我喜欢打破对用户依赖的想法,但这是不是太过分了,可能会使我的代码更难阅读?

这是一个非常好的问题,当你阅读和听说DI时,它是有意义的,这是下一个自然的结论

首先,史蒂文的观点是正确的,你不应该把集装箱到处传递。如果您需要动态构建IUser,并且它需要是抽象的,那么您应该注入一个抽象工厂

塞巴斯蒂安也发布了一个很好的链接

事实上,我在我发布的回复中写到了这一点

文章的底部部分:

<>不是每个对象和依赖项都需要或应该是依赖注入的,首先考虑如果使用的是实际的依赖项:

什么是依赖关系

Application Configuration
System Resources (Clock)
Third Party Libraries
Database
WCF/Network Services
External Systems (File/Email)
上述任何对象或合作者都可能超出您的控制范围,导致副作用和行为差异,并使其难以测试。这是考虑抽象(类/接口)并使用DI.< /P>的时间。 什么不是依赖,不需要DI

List
MemoryStream
Strings/Primitives
Leaf Objects/Dto's
因此,在您的特定情况下,这实际上取决于构建IUser时会发生什么,也取决于您是否需要用不同的实现来替换它。如果情况并非如此,并且用户只有简单的类型,没有外部依赖关系或副作用,那么只需重新创建它即可

考虑当你调用新的用户()时会发生什么,看看下面的图表,如果它导致其他对象被创建,并且看起来像下面的图表中的东西,考虑IOC。< /P> 级联依赖关系对象图:

在本例中,新对象需要或创建一大堆其他依赖项。这些依赖项是什么或做什么很可能超出您的控制


当您的对象是一个简单的dto时,它不会遇到此问题,并且可能不需要太多IoC。

当您从服务中调用容器时,您正在执行服务定位器反模式。请阅读以下内容,了解不应执行此操作的原因:。这是否意味着可以新建对象?或者也应该将这些依赖项注入构造函数中。我认为在构造函数中注入大量依赖项不是一个好主意,因此使用了服务定位器模式。目前,我正在我的HomeController中更新许多对象。那么我该如何消除依赖性呢?也许关于newables和injectables会有所帮助。你应该将数据和行为分开。新创建的包含数据的对象(DTO)允许注入包含行为(服务)的对象。我决定采纳您的建议,检查每个对象在DI方面的优点。谢谢你的详细回答。