我没有做太多的IOC,但是从我读到的内容和我在互联网上看到的例子来看,它让我很困惑。
我的理解是你应该使用IOC来推广松耦合系统。
现在用代码(Unity)构建容器我公司使用的容器如果我必须对我的服务EG有一个硬参考,那么它如何解耦
IUnityContainer container=new UnityContainer()
.RegisterType<IMyService,MyService>();
正如您所看到的,MyService是一个具体的类,需要我引用我的服务层。
我现在不打败这一点吗?
非常欢迎任何示例或建议或观点
答案 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,从而使主应用程序免于潜在的大量耦合,但权衡如下: