AutoMapper 的 (4.2+) 配置文件是逻辑还是基础架构的一部分?

Is AutoMapper's (4.2+) Profile part of Logic or Infrastructure?

我有 WCF 服务,它的作用类似于 ORM。我需要一个映射器来将实体映射到 Dtos。考虑到 关注点分离SOLIDDDD,我想知道 AutoMapper 配置和配置文件应该在哪里走?我的项目结构如下所示:

数据 (EF) -> 逻辑 -> WCF 服务/WCF 合同 -> Windows服务(主机)

我遵循了 github 的规则,我创建了一个 Ninject 模块:

public class AutoMapperModule : NinjectModule
{
    public override void Load()
    {
        Bind<IValueResolver<SourceEntity, DestModel, bool>>().To<MyResolver>();

        var mapperConfiguration = CreateConfiguration();
        Bind<MapperConfiguration>().ToConstant(mapperConfiguration).InSingletonScope();

        // This teaches Ninject how to create automapper instances say if for instance
        // MyResolver has a constructor with a parameter that needs to be injected
        Bind<IMapper>().ToMethod(ctx =>
             new Mapper(mapperConfiguration, type => ctx.Kernel.Get(type)));
    }

    private MapperConfiguration CreateConfiguration()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfiles(new SampleProfile());
        });

        return config;
    }
}

public class SampleProfile : Profile
{
    public SomeProfile()
    {
        CreateMap<Foo, FooDto>();
    }
}

我总是在可执行程序的入口处创建一个Ninject模块,所以在Windows服务中。但我有点困惑,因为我的 Windows 服务项目没有 "Data" 引用(带有实体)。所以我有几个问题:

  1. 我是否应该在 Windows 服务(主机)中添加对 "Data" 项目的引用并在 Windows 服务中创建一个 AutoMapper 配置文件 class?
  2. 我是否应该在 Logic class 中定义 AutoMapper Profile class(它知道 Dtos 和 Entities),然后在 WindowsService 中引用 Logic,其中模块将被初始化?
  3. 我应该将 AutoMapper 配置文件放在其他地方吗?

谢谢!

使用 Java,使用此结构

Data (EF) -> Logic -> WCF Services / WCF Contracts -> WindowsService (host)

我觉得作为一组不同packages/projects。每个 package/project 然后是(在我的解释中):

  • Data (EF): Entities 到 Persistence 的映射,知道如何获取 Entity 并将其转换为 Dto(这里我会把 configuration/logic 告诉 AutoMapper 如何转换对象)
  • 逻辑:域的逻辑在哪里,它应该是体系结构的核心,它应该(必须,我会说)不知道其他 packages/projects
  • WCF 服务/WCF 契约:一组公开功能的接口
  • WindowsService(主机):接口的实现,因此是其他 packages/projects 之间的粘合代码所在。例如,在这里我将放置 AutoMapper 的配置文件。

WindowsService(主机) 是一种基础设施层,所有的东西都放在一起。在这里,您需要引用您将要使用的每个 package/project(数据、逻辑、WCF 服务/WCF 合同)。

将配置文件放在 Logic 中,因为这是您可以放置​​它的最上游点,即 Logic 具有映射的两侧(实体和 Dtos)。如果您想像@Luca 建议的那样保持 Logic 在美学上的干净,那么您可能需要考虑将 Dto 移动到 WCF 层(连同配置文件)。

您的 windows 服务肯定已经引用了此逻辑。

这样,可能使用此逻辑的其他项目(也许是 Web 应用程序)也将具有要使用的配置文件。