AutoMapper 的 (4.2+) 配置文件是逻辑还是基础架构的一部分?
Is AutoMapper's (4.2+) Profile part of Logic or Infrastructure?
我有 WCF 服务,它的作用类似于 ORM。我需要一个映射器来将实体映射到 Dtos。考虑到 关注点分离、SOLID 和 DDD,我想知道 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" 引用(带有实体)。所以我有几个问题:
- 我是否应该在 Windows 服务(主机)中添加对 "Data" 项目的引用并在 Windows 服务中创建一个 AutoMapper 配置文件 class?
- 我是否应该在 Logic class 中定义 AutoMapper Profile class(它知道 Dtos 和 Entities),然后在 WindowsService 中引用 Logic,其中模块将被初始化?
- 我应该将 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 应用程序)也将具有要使用的配置文件。
我有 WCF 服务,它的作用类似于 ORM。我需要一个映射器来将实体映射到 Dtos。考虑到 关注点分离、SOLID 和 DDD,我想知道 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" 引用(带有实体)。所以我有几个问题:
- 我是否应该在 Windows 服务(主机)中添加对 "Data" 项目的引用并在 Windows 服务中创建一个 AutoMapper 配置文件 class?
- 我是否应该在 Logic class 中定义 AutoMapper Profile class(它知道 Dtos 和 Entities),然后在 WindowsService 中引用 Logic,其中模块将被初始化?
- 我应该将 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 应用程序)也将具有要使用的配置文件。