如果我在ASP.NET MVC应用程序中使用存储库模式,我需要DI让程序知道,必须映射类的接口。如果我实现Unity,我需要将DAL项目添加到我的MVC项目中,然后在global.asax中注册类型。
在我看来,我认为将DAL Layer的命名空间添加到MVC项目是不好的,中间还有一个业务层。我认为,在业务层中注入DAL类并在MVC应用程序中仅注入业务层映射会很美妙。
这里有什么方法?你有什么建议吗?
更新: 向我说清楚。在服务层中,只有DTO和业务和数据访问层的DI。在服务层中,我将DTO映射到域模型。我不明白的是,我怎样才能调用业务层方法呢?
答案 0 :(得分:4)
如果您想要务实,真正的3层架构需要服务层。服务和MVC之间是数据传输对象(DTO)。服务层隐藏了DAL和业务层。
如果你这样设置,MVC本身对DAL一无所知,只知道DTO和服务(合同)。
答案 1 :(得分:3)
即使您不使用不同的服务层,您也可以完成所需的操作,即使用DI将MVC应用程序与DAL项目分离。
执行此操作的方法是在两者之间添加一些项目/程序集,将IoC容器与您定义的接口的特定实例相连接。
我通常使用这种命名约定:
MyCompany.MyProject.Infrastructure
MyCompany.MyProject.Abstract
您的主要MVC项目将引用您的抽象和基础设施项目。您的基础结构项目将引用抽象和特定于实例的项目,如Business和DAL项目。在基础结构项目中,您可以连接依赖项。
您必须为MVC项目设置一种机制,以便在基础架构程序集中引导您的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;
}
}
答案 2 :(得分:0)
您应该使用DI将Domain / DAL接口注入构造函数。这有很多好处,包括允许您在编写单元测试时使用moq接口。您可以使用Autofac来处理注射。