将IUnityContainer本身作为ASP.NET MVC控制器构造函数中的参数注入是一种首选方法

Jai*_*ews 1 asp.net-mvc dependency-injection unity-container asp.net-mvc-4

我在asp.net MVC 4中使用Unity.Mvc4并且内置Bootstrapper文件来注册所有类型,如下所示.

   public static class Bootstrapper
        {
            public static IUnityContainer Initialise()
            {
                var container = BuildUnityContainer();

                DependencyResolver.SetResolver(new UnityDependencyResolver(container));

                return container;
            }
    -----------------------
    ------------------------
Run Code Online (Sandbox Code Playgroud)

在我的Controller构造函数中,我正在注入IUnityContainer本身以按需调用Resolve(),如下所示

 private IQuestionBusinessLogic _qstnBL;

 public MyController(IUnityContainer unityContainer)
            : base(unityContainer)

        {   

                     qstnBL = _unityContainer.Resolve<IQuestionBusinessLogic>();
    }
Run Code Online (Sandbox Code Playgroud)

查询是

  1. 注入IUnityContainer unityContainer本身会有任何性能负担吗?
  2. 有没有其他方法调用Resolve()而不是以这种方式访问​​IUnityContainer unityContainer?
  3. 打电话给Resolve()它自己有任何性能负担吗?

Wik*_*hla 5

这是构建课程的一种非常糟糕的方法.您不必在服务之间建立明确的依赖关系,而是依赖于特定的IoC框架来破坏您的类.

IoC成为您班级设计中不可或缺的一部分.它不是一个"看不见的帮手",而是一流的公民.

相反,你应该让你的类依赖于你的其他类:

public MyController( IQuestionBusinessLogic questionBusinessLogic )
        : base()
{   
}
Run Code Online (Sandbox Code Playgroud)

并让特定的依赖项解析器满足您的依赖项.这样您就可以从IoC依赖项中释放您的基础架构.具体来说,依赖项解析器是在应用程序的Composition Root部分中定义的(很可能是解决方案的主要项目),它是唯一将类粘合到特定IoC的类.

使用IoC框架的一个重要原则是"设计您的类和依赖关系,好像没有IoC框架.然后,只介绍一个帮助您,而不是让您依赖它".