首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理论:“服务定位器”"IOC容器“"IOC”"DI“

理论:“服务定位器”"IOC容器“"IOC”"DI“
EN

Stack Overflow用户
提问于 2016-10-15 06:14:50
回答 3查看 641关注 0票数 0

你能帮我讲讲一些模式的理论吗?我试着描述它们,我尽了最大的努力,但我认为我的陈述是错误的,所以帮助))。

1) "DI“和"IOC”相同。

2) "IOC Container“--它是一个对象的实例,可以解析如下依赖关系:

代码语言:javascript
复制
void Test()
{
    // create IOC Container to resolve
    // dependences for SomeMethod method
    var container = new SomeContainer();
    container.For(typeof(IEmaleSender), typeof(SuperEmaleSender));

    // Pass IOC Container to resolve dependences in SomeMethod
    SomeMethod(container);
}

void SomeMethod(SomeContainer container)
{
    IEmaleSender emailSender = container.Resolve(IEmaleSender);
    emailSender.SendEmail();
}

3)“服务定位器”--它类似于包含Dictionary<Type, object>的静态对象,其中value是一个键类型的实例。这个静态对象有两个方法:AddGet。因此,我可以在应用程序启动时添加对象,并从任何地方请求它:

代码语言:javascript
复制
void Test()
{
    // Assign instanse of SuperEmaleSender to Locator
    SuperEmaleSender emailSender = new SuperEmaleSender()
    SomeLocator.Add(typeof(SuperEmaleSender), emailSender);

    SomeMethod();
}

void SomeMethod()
{
    SuperEmaleSender emailSender = SomeLocator.Get(typeof(SuperEmaleSender));
    emailSender.SendEmail();
}

4)将“服务定位器”和"IOC容器“结合起来是一个很好的做法。因此您可以在应用程序启动时实例化"IOC容器“,并通过”服务定位器“从任何地方请求它。

5)在ASP MVC5中,已经包含了“服务定位器”。我说的是DependencyResolver

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2016-10-15 06:34:42

至于服务定位器与IoC的结合--当你有了合适的IoC容器时,你真的不应该使用服务定位器(或者在大多数情况下你根本不应该使用它),因为IoC和DI的全部要点是传递来自类外部的依赖关系,并明确地指定这个类有什么依赖关系。在内部使用服务定位器将隐藏依赖关系。Service locator is by some people considered an anti-pattern

票数 3
EN

Stack Overflow用户

发布于 2016-10-15 06:18:53

服务定位器几乎是一个非常原始的依赖注入。它通常只允许您返回单例实例。它不是真正的DI,因为你必须手动获取实例和新的up对象,而不是让DI引擎为你做这件事(新的up对象并将服务引用注入其中)。DI还可以让您更好地控制对象的生命周期。

票数 1
EN

Stack Overflow用户

发布于 2016-10-15 06:42:02

DI代表依赖注入,IoC代表控制反转。假设你有一个访问数据库的类。该类负责插入一个项,但您需要一个数据库连接来执行此操作。如果类的响应性只是插入一个项,它将不知道如何启动该连接,只知道如何使用它。考虑到这一点,您将把连接设置为该类的依赖项,并将创建该连接的责任传递给任何想要使用它的人。您正在使用依赖注入反转控件,将响应性传递给任何知道连接如何工作的人。

您可以使用IoC容器来帮助管理类之间的依赖关系。

您可以查看此问题以获得更详细的答案:Inversion of Control vs Dependency Injection

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40052744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档