这是解决方案结构:
这些服务位于MyProject.Core中。因此,我想在MyProject.DAL的模型之间使用映射。 (Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection
)
return _mapper.Map<Core.Model>(DAL.model);
,当然反之亦然。
问题是:我是否需要在两个项目中都引用AutoMapper?
还是在MyProject.Core中创建一个ConfigureAutoMapper
类,然后在MyProject.WebApplication
的启动类中调用它?
那呢?
services.AddAutoMapper();
答案 0 :(得分:0)
我遇到了同样的问题,为此,我想到的最佳解决方案是在我的类库中定义一个扩展方法以进行一些初始化,以便仅在我在其中调用AddAutoMapper
之前将其程序集加载到内存中我的主要项目startup.cs:
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
遵循愿望,而不是解决方案:
最好的方法是多次调用AddAutoMapper,但不幸的是,根据本次讨论,它已被拒绝:
https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/issues/25
那我将能够以如下扩展方法加载个人资料:
public static class Extensions
{
public static void AddClassLibraryServices(this IServiceCollection services)
{
services.AddAutoMapper(typeof(MyClassLibraryAutoMapperProfile));
}
}
当前这样做是弄乱了在主项目中收集的Profiles的最终列表。
答案 1 :(得分:-1)
由于两种转换都将在您的服务中完成,因此只需将automapper包装在注入的接口中就可以了。一切都应该在MyProject.Core中完成。
编辑:
关于服务,这取决于您如何创建它们。本质上,您需要一个映射服务,因此请与其他任何服务一样创建它,并将其注入需要映射的类中。
我喜欢这种模式:
public class MyService : IMyService
{
public MyService(IDepedencySolver ds, IRepository rep = null, IMapper mapper = null)
{
_rep = rep ?? ds.GetService<IDependencySolver>();
_mapper = mapper ?? ds.GetService<IMapper>();
...
}
}
它允许您仅注入服务解析器(例如Autofac / Splat / etc),或将所有注入作为模拟在测试中。
有些人喜欢将默认解析器作为静态变量,以便避免使用第一个参数。
因此,要回答在两个项目中是否都需要AM引用的问题:否,仅在MyProject.Core中,您实际在其中使用Automapper类。
您应该将它们包装在IMapperService
或类似的东西中。然后,在MVC中,当您注册服务时,将注册new MapperService()
的实例-为此,您只需要引用MyProject.Core