2017-08-03 69 views
0

我目前已经构建了一个具有Web项目(controllers/views/scripts),服务项目(业务层,构建视图模型)和存储库项目(数据访问层)的MVC解决方案。在多个项目中配置AutoMapper

我以前在我的项目中使用过AutoMapper,并试图在此解决方案中配置AutoMapper。通常情况下,我将所有地图配置为MapperConfig.cs,在Global.asax.cs中调用。

我的问题是,我通常配置AutoMapper的web项目只能引用services项目,而services项目只能引用数据项目。所以,当我像往常一样去配置我的地图时,由于Web项目没有引用数据项目,我无法为数据项目定义地图。我需要一种方法来配置我的数据访问层映射,而无需为数据项目添加对Web项目的引用。

项目依赖图看起来像下面这样:

网络PROJ - >服务凸出 - >数据凸出

我怎样才能解决这个?

+0

为什么你想只有一个配置自动映射器? 你真的有跨越所有层的类/ dtos吗? – ironstone13

+0

我没有跨越我所有层的类。我一直无法找到一种方法来定义每个项目的地图 - 这正是我想要克服的。对于Ninject,我通过在每个项目中创建类从'NinjectModule'继承的类来实现这一点。如果您可以发布AutoMapper示例,我将很乐意接受 – GregH

+0

如何使用静态构造函数来启动每个项目中的地图 - 请参阅https:// stackoverflow。com/questions/30136415/where-to-place-automapper-map-registration-in-referenced-dll – ironstone13

回答

1

无需在所有项目中映射注册文件单个,特别是您说您没有任何交叉类型。

简单方法是确定每个项目配置文件,并使这些配置互相调用,重复的程序集的分层依赖性,象下面这样:

Global.asax.cs --> WebProjMapRegistrations.Register()-->ServicesMapRegistrations.Register()-->DataMapRegistrations.Register() 

或者,您可以使用Assembly Scanning for auto configuration

正如@Jimmy Bogard所述,当您运行您的web应用程序时,全部应用程序的程序集最终会加载到您的应用程序域 - 因此您可以从所有程序集中获取所有配置文件,并将它们添加到映射程序配置中:How to Initialize AutoMapper Profiles in referenced project DLLs in ASP.Net webapp

另一种替代方法适用于ASP.NET应用程序在这里找到: Where to place AutoMapper map registration in referenced dll

1

我在某些ASP.Net MVC项目中处理这个方法是通过使用AutoMapper Profiles

您可以创建单独的映射配置文件来处理为该项目/装配中的对象创建映射。

然后,您可以手动添加配置文件到整体配置,或者您可以使用Reflection/Assembly scanning自动加载配置文件。