【问题标题】:IOC Container build in code vs configuration.Advice neededIOC Container 内置代码与配置。需要建议
【发布时间】:2023-03-28 00:44:01
【问题描述】:

我没有做过多少国际奥委会,但从我读到的内容和我在互联网上看到的例子让我感到困惑。

我的理解是你应该使用IOC来推广松耦合系统。

现在在我的公司使用的代码 (Unity) 中构建容器,如果我必须硬引用我的服务 EG,如何将其解耦

   IUnityContainer container=new UnityContainer()
    .RegisterType<IMyService,MyService>();

如您所见,MyService 是一个具体的类,它需要我引用我的服务层。

我现在不是说错了吗?

非常欢迎任何示例或建议或观点

【问题讨论】:

标签: c# inversion-of-control unity-container


【解决方案1】:

容器正在帮助您构建松散耦合的应用程序,但松散耦合并不意味着您似乎在暗示“对其他程序集没有硬引用”。

实现它的接口和类可能存在于同一个程序集、同一个命名空间、同一个 .cs 文件中的事件,这与松耦合或紧耦合无关。

这是关于根据抽象而不是具体实现使用其他类型的类。您的注册代码了解抽象和具体实现这一事实是可以的。毕竟你需要一些耦合。

在机制方面,您可以简化注册,每次都不要提及这两种类型,甚至通过使用约定 in some other containers like Windsor 甚至不引用其他程序集(Unity 最好不支持基于约定的注册知识)。

再说一遍 - 这是机制,与松耦合与紧耦合或使用容器的原因无关。它只是让容器的使用更简单。

HTH

【讨论】:

  • “在其他程序集上没有硬引用”,正如你所暗示的那样。”这正是我的观点。我真的这么想。我确实看到一个人的帖子现在找不到链接了就是这样。IOC 的唯一要点是不使用具体的实现
  • 你是对的。有很多东西要学,但是很难找到你自己学习的最佳实践。
  • 查看 Windsor 的文档。它不仅谈论使用 API,还谈论模式、建议的用法、陷阱等。
  • 看看这个链接,告诉我你的想法anderly.com/2010/11/09/…
【解决方案2】:

以一个MVC应用为例,配置

UnityContainer container = new UnityContainer()
    .RegisterType<IMyService, MyService>();

将在应用程序启动时创建,当您在控制器中使用IMyService 时,好处就来了:

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    } 

    public ActionResults Index()
    {
        var model = _myService.GetModel();
        return View(model);
    }
}

将此与以这种方式使用它的系统进行比较:

public ActionResults Index()
{
    var model = new MyService().GetModel();
    return View(model);
}

现在您已与该实施结为夫妻。现在单元测试变得非常困难,因为无法模拟 IMyService

【讨论】:

  • 感谢您的回复。这一切都很好,但这意味着我需要添加对 MyService 所在程序集的引用,因此我们现在正在耦合。我错了吗?使用 Config 我不需要添加参考 我错过了明显的吗?
  • @user712923:嗯,您必须在系统之间进行一些耦合,否则它们将无用。参考文献并不是什么大问题,恕我直言,只要您对此很聪明。避免使用 config 进行引用也很好(就像 Microsoft 对提供程序所做的那样),但您仍然需要在运行时访问该程序集——您仍然依赖它在 bin 或 GAC 中。
【解决方案3】:

当您通过代码构建 IoC 容器时,工作中的主要概念是 Instability。不稳定性是面向对象系统的度量,用于测量传出耦合与总耦合的比率。它在“部署包”级别应用时最有用 - 对于 .NET 来说就是程序集。

使用此指标时,目标不是始终实现低不稳定性,而是通过将不稳定性聚合到其他组件中来提高某些组件的稳定性(接近 0 传出耦合)。

根据您使用的平台,您的 .Exe(或包含您的 HttpApplication、ServiceHost 等的程序集)应负责管理应用程序启动、应用程序关闭以及所有依赖项的聚合,包括构建您的 IoC(这将使部署过程变得更容易,因为基本部署方案要求您的运行时项目引用任何依赖项)。

可以使用配置文件配置您的 IoC,从而使您的主应用程序免于潜在的大量耦合,但权衡如下:

  • 在注册要针对其接口解析的实例之前,您无法手动构建实例(可能执行一些通过配置难以实现的初始化)。
  • 构建检查 - 例如错误输入类名称或接口名称。
  • 易于部署。如果您没有在主项目中引用包含接口实现的程序集,则必须手动部署它们或手动将它们添加到您的安装项目(如果您正在使用)。这可能或多或少是个问题,具体取决于环境和任何现有的部署流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多