C# IOC容器内置代码与配置。需要建议
我在国际奥委会做的不多,但从我所读到的和我在互联网上看到的例子来看,这让我感到困惑 我的理解是,您应该使用IOC来促进松耦合系统 现在,在代码中构建容器(Unity)我的公司使用的容器如果我必须对我的服务进行硬引用,如何将其解耦C# IOC容器内置代码与配置。需要建议,c#,inversion-of-control,unity-container,C#,Inversion Of Control,Unity Container,我在国际奥委会做的不多,但从我所读到的和我在互联网上看到的例子来看,这让我感到困惑 我的理解是,您应该使用IOC来促进松耦合系统 现在,在代码中构建容器(Unity)我的公司使用的容器如果我必须对我的服务进行硬引用,如何将其解耦 IUnityContainer container=new UnityContainer() .RegisterType<IMyService,MyService>(); IUnityContainer container=newunityc
IUnityContainer container=new UnityContainer()
.RegisterType<IMyService,MyService>();
IUnityContainer container=newunitycontainer()
.RegisterType();
正如您所看到的,MyService是一个具体的类,它需要我对我的服务层进行引用
我现在不是在反驳这一点吗
任何示例、建议或视图都是非常受欢迎的容器可以帮助您构建松散耦合的应用程序,但松散耦合并不意味着您所建议的“在其他程序集上没有硬引用” 实现它的接口和类可能位于同一程序集中、同一命名空间中、同一.cs文件中的事件中,这与松耦合或紧耦合无关 它是关于使用其他类型的类,这取决于抽象,而不是具体实现。事实上,您的注册码同时具备抽象和具体实现的知识是可以的。毕竟,你需要一些耦合 就机制而言,您可以简化注册,并且每次都不提及这两种类型,甚至不使用约定引用其他程序集(据我所知,Unity不支持基于约定的注册) 同样,这是一种力学,与松耦合与紧耦合或使用容器的原因无关。这只会使容器的使用更简单
HTH以MVC应用程序为例,配置
UnityContainer container = new UnityContainer()
.RegisterType<IMyService, MyService>();
将其与以这种方式使用它的系统进行比较:
public ActionResults Index()
{
var model = new MyService().GetModel();
return View(model);
}
现在你已经嫁给了那个实现。单元测试现在变得非常困难,因为无法模拟
IMyService
当您通过代码构建IoC容器时,工作中的主要概念是。不稳定性是面向对象系统测量传出耦合与总耦合比率的一种度量。它在“部署包”级别应用时最有用,对于.NET来说,它是程序集
当使用此度量时,目标不是始终实现较低的不稳定性,而是通过将不稳定性聚合到其他程序集中来提高某些程序集的稳定性(接近0传出耦合)
根据您使用的平台,您的.Exe(或包含HttpApplication、ServiceHost等的程序集)应负责管理应用程序启动、应用程序关闭和所有依赖项的聚合,包括构建IoC(这将使部署过程更加容易,因为基本部署场景要求运行时项目引用任何依赖项)
可以使用配置文件配置IoC,从而避免主应用程序可能出现的大量耦合,但折衷如下:
- 在根据实例接口注册要解析的实例之前,您将无法手动构建实例(可能执行一些通过配置很难完成的初始化)
- 生成检查-例如,输入错误的类名或接口名
- 易于部署。如果您没有在主项目中引用包含接口实现的程序集,则必须手动部署它们或将它们手动添加到安装项目(如果您正在使用安装项目)。这可能或多或少是一个问题,具体取决于环境和可能存在的任何现有部署过程
public ActionResults Index()
{
var model = new MyService().GetModel();
return View(model);
}