假设我有一个包含许多程序集的ASP.NET MVC Web应用程序。这是一个非常简单的例子:
- MyApp.Web:Web应用程序 - MyApp.Services:包含域服务的接口和实现,例如IOrderProcessor、DefaultOrderProcessor - MyApp.DAL:包含存储库的接口和实现,例如IOrderRepository、SqlOrderRepository
Web应用程序将在启动期间初始化IoC容器(例如注册控制器等)。我不确定谁应该负责注册域服务和存储库。
现在我所做的是,在每个程序集中创建一个静态类,每个类都包含一个负责注册程序集中包含类型的方法。例如,对于DAL程序集:
这些方法随后在 Web 应用程序启动期间被调用(在单元测试项目中,我当然无法使用这些方法,但必须在测试项目中注册所有测试实现)。
我不确定这是否是一种好的做法。例如,此解决方案将两个程序集绑定到特定的 IoC 容器(在上面显示的示例中为 Unity)。这似乎是可能的反模式(类似于使用服务定位器模式)。
因此,我想听听您对如何处理这个问题的意见,例如:
- 所有注册事项是否应由主应用程序(Web 应用程序)处理? - 这是否会使主应用程序过多地了解独立(自包含)程序集的内容? - 我是否应该使用自制接口来抽象特定的 IoC 容器? - 还有其他需要考虑的事情吗?
- MyApp.Web:Web应用程序 - MyApp.Services:包含域服务的接口和实现,例如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)。这似乎是可能的反模式(类似于使用服务定位器模式)。
因此,我想听听您对如何处理这个问题的意见,例如:
- 所有注册事项是否应由主应用程序(Web 应用程序)处理? - 这是否会使主应用程序过多地了解独立(自包含)程序集的内容? - 我是否应该使用自制接口来抽象特定的 IoC 容器? - 还有其他需要考虑的事情吗?