Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IOC容器内置代码与配置。需要建议_C#_Inversion Of Control_Unity Container - Fatal编程技术网

C# IOC容器内置代码与配置。需要建议

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

我在国际奥委会做的不多,但从我所读到的和我在互联网上看到的例子来看,这让我感到困惑

我的理解是,您应该使用IOC来促进松耦合系统

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

   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,从而避免主应用程序可能出现的大量耦合,但折衷如下:

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

如果您已在服务层中向容器注册了类型。那么容器将创建创建MyService实例所需的类型的实例。相关:相关:感谢您的回复。这一切都很好,但这意味着我需要添加对MyService所在程序集的引用,因此我们现在正在耦合。我明白了吗g?使用配置我不需要添加引用。我是否遗漏了明显的问题?@user712923:好吧,系统之间必须有一些耦合,否则它们将不会有用。引用并不是一个大问题,IMHO,只要你很聪明。使用配置避免引用也很好(就像微软对提供商所做的那样)但您仍然需要在运行时访问该程序集——您仍然依赖于它位于bin或GAC中。正如您所建议的那样,“在其他程序集上没有硬引用”。"这正是我的观点。我真的这么想。我确实看到了一个家伙的帖子,他现在找不到支持这一点的链接。国际奥委会的唯一目的不是使用具体的实施。你是对的。有很多东西需要学习,但很难找到你自己学习的最佳实践。查看温莎的文档。它不仅仅是讨论API的使用,同时也讨论模式、建议用法、陷阱等。看看这个链接,告诉我你的想法
public ActionResults Index()
{
    var model = new MyService().GetModel();
    return View(model);
}