代码之家  ›  专栏  ›  技术社区  ›  M4N

在IOC容器中注册类型应该由谁负责?

  •  3
  • M4N  · 技术社区  · 14 年前

    假设我有一个ASP.NET MVC Web应用程序,它包含许多程序集。下面是一个非常简单的例子:

    • myapp.web版
      • Web应用程序
    • myapp.服务
      • 包含域服务的接口和实现,例如iorderprocessor、defaultorderprocessor
    • Myapp.dal公司
      • 包含存储库的接口和实现,例如iorderrepository、sqlorderrepository

    Web应用程序将在启动期间初始化IOC容器(例如,注册控制器等)。我不确定注册域服务和存储库应该由谁负责。

    我现在所做的是在每个程序集中创建一个静态类,每个类包含一个方法,负责注册程序集中包含的类型。例如,对于DAL组件:

    namespace MyApp.DAL
    {
      public static class AssemblyInitialization
      {
        public static void RegisterTypes(IUnityContainer container)
        {
          var lm = new TransientLifestyleManager();
          container.RegisterType<IOrderRepository, SqlOrderRepository>(lm);
          ...
        }
      }
    }
    

    然后,Web应用程序在启动期间调用这些方法(在单元测试项目中,我当然不能使用这些方法,但必须在测试项目中注册所有测试实现)。

    我不确定这是否是一个好的做法。例如,此解决方案将两个程序集绑定到特定的IOC容器(上面所示示例中的Unity)。这似乎是一种可能的反模式( similar to using the service-locator pattern )

    因此,我想征求您对如何处理这一问题的意见,例如:

    • 所有注册资料都应该由主应用程序(Web应用程序)处理吗?
    • 或者这是否会将有关独立(自包含)程序集内容的过多知识放入主应用程序中?
    • 我应该使用自制的接口抽象特定的IOC容器吗?
    • 其他需要考虑的事情?
    3 回复  |  直到 14 年前
        1
  •  1
  •   Bertvan    14 年前

    在你的入口点开始“引导”。但是,可以使用在这些程序集中实现iRegistration的类将注册委托给每个加载的程序集。

    这几乎就是你现在所做的。但是,除了使用静态类之外,您还可以通过对初始化的反射来找到iRegistration实现。

    既然你使用的是MVC,那就看看涡轮,它在这方面做得很好。或者更好的是,在应用程序中使用它:)

        2
  •  1
  •   Aliostad    14 年前

    它始终是入口点的责任,在这种情况下,这里是您的myapp.web。这通常“进入/从”你的glabal.asax.

        3
  •  0
  •   Will    14 年前

    imho,您的代码应该尽可能长时间地推迟做出这个选择——直到最后一个负责任的时刻。我使用Unity,所以我可以等到web.config加载后再声明我希望注入的类型。

    我相信,如果您不使用配置文件来执行此操作,那么您就做错了什么。使用DI框架的目的是减少和/或删除这些编译时依赖项。