即使您不使用不同的服务层,您也可以完成您想要的,即使用 DI 将 MVC 应用程序与 DAL 项目解耦。
实现这一点的方法是在它们之间添加几个项目/程序集,将 IoC 容器与您定义的接口的特定实例连接起来。
我通常使用这个命名约定:
然后,您的主 MVC 项目将引用您的 Abstract 和 Infrastructure 项目。您的基础设施项目将引用抽象和实例特定项目,如业务和 DAL 项目。在基础架构项目中,您可以连接依赖项。
您必须为您的 MVC 项目设置一种机制,以在 Infrastructure 程序集中引导您的 IoC。您可以在 global.asax 中或作为 App_Start 方法执行此操作,并在基础结构程序集中调用 Registration 类。
我们使用的是 StructureMap,但概念是一样的。这是一些示例代码。
在您的 MVC 应用程序中,创建一个 App_Start 方法来设置 DI。
public static class StructuremapMvc
{
public static void Start()
{
// Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies.
ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory());
IContainer container = IoC.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
}
}
在您的基础设施程序集中,连接依赖项。
public static class IoC
{
public static IContainer Initialize()
{
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.For<IRepositoryNum1>().Use<Num1Repository>();
x.For<IRepositoryNum2>().Use<Num2Repository>();
x.For<IRepositoryNum3>().Use<Num3Repository>();
});
return ObjectFactory.Container;
}
}