IOC Container构建代码与配置。所需的建议

时间:2011-06-04 09:33:04

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

我没有做太多的IOC,但是从我读到的内容和我在互联网上看到的例子来看,它让我很困惑。

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

现在用代码(Unity)构建容器我公司使用的容器如果我必须对我的服务EG有一个硬参考,那么它如何解耦

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

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

我现在不打败这一点吗?

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

3 个答案:

答案 0 :(得分:2)

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

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

它是关于使用其他类型的类,取决于抽象,而不是具体实现。您的注册代码知道抽象和具体实现的事实是可以的。毕竟你需要有一些耦合。

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

再次 - 这是机制,与松散与紧密耦合或使用容器的原因无关。它只是简化了容器的使用。

HTH

答案 1 :(得分:0)

以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

答案 2 :(得分:0)

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

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

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

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

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