gpt4 book ai didi

c# - 如何在没有全局静态服务(非服务定位器解决方案)的情况下实现 IOC?

转载 作者:IT王子 更新时间:2023-10-29 04:11:27 24 4
gpt4 key购买 nike

我们想为 IOC 使用 Unity。我所看到的是有一个全局静态服务(让我们称之为 IOCService)的实现,它持有对 Unity 容器的引用,它注册了所有接口(interface)/类组合,每个类都询问该对象:给我一个实现对于 Ithis 或 IThat。

我经常看到这种模式不好的回应,因为它导致所有类都依赖于 IOCService(而不是 Unity 容器,因为它只在 IOCService 内部已知)。

但我不经常看到的是:替代方法是什么?

米歇尔

编辑:发现全局静态服务称为服务定位器,将其添加到标题中。

最佳答案

另一种方法是仅在最高应用程序级别拥有容器的单个实例,然后使用该容器解析您需要在该层创建的每个对象实例。

例如,大多数可执行文件的主要方法看起来像这样(减去异常处理):

private static void main(string[] args) {

Container container = new Container();

// Configure the container - by hand or via file

IProgramLogic logic = container.Resolve<IProgramLogic>();

logic.Run();
}

您的程序(此处由 IProgramLogic 实例表示)不必了解您的容器的任何信息,因为 container.Resolve 将创建它的所有依赖项 - 以及它的依赖项的依赖项,一直到没有自己依赖项的叶类。


ASP.NET 是一个更难的案例,因为 Web 表单不支持构造函数注入(inject)。我通常在我的 Web 表单应用程序中使用 Model-View-Presenter,所以我的 Page 类实际上只有一个依赖项 - 对它们的展示者。我不对它们进行单元测试(所有有趣和可测试的东西都在我的演示者中,我测试),而且我从不替换演示者。所以我不反对框架 - 我只是在我的 HttpApplication 类(在 global.asax.cs 中)公开一个容器属性,并直接从我的 Page 文件中使用它:

protected void Page_Load(object sender, EventArgs args) {
ICustomerPresenter presenter = Global.Container.Resolve<ICustomerPresenter>();
presenter.Load();
}

那当然是服务定位器 - 尽管 Page 类是唯一耦合到定位器的东西:您的展示器及其所有依赖项仍然与您的 IoC 容器实现完全分离。

如果您的 Page 文件中有很多依赖项(也就是说,如果您不使用 Model-View-Presenter),或者解耦您的 Page 对您来说很重要 您的 Global 应用程序类中的类,您应该尝试找到一个集成到 Web 表单请求管道中的框架并使用属性注入(inject)(正如 Nicholas 在下面的评论中所建议的那样) - 或者写你自己的IHttpModule并自己执行属性注入(inject)。

关于c# - 如何在没有全局静态服务(非服务定位器解决方案)的情况下实现 IOC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3006617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com