我有WCF服务,就像ORM一样。我需要一个映射器将实体映射到Dtos。考虑到关注点,SOLID和DDD的分离,我想知道AutoMapper配置和配置文件应该去哪里?我的项目结构如下:
数据(EF) - >逻辑 - > WCF服务/ WCF合同 - > WindowsService(主机)
我遵循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服务项目没有“数据”引用(与实体)。所以我有几个问题:
谢谢!
使用Java,使用此结构
数据(EF) - >逻辑 - > WCF服务/ WCF合同 - > WindowsService(主机)
我认为是一组不同的包/项目。那么每个包/项目(按我的解释):
WindowsService(主机)是一种基础结构层,所有内容都放在一起。在这里,您需要参考您将要使用的每个包/项目(数据,逻辑,WCF服务/ WCF合同)。
将配置文件放在Logic中,因为这是您可以设置的最上游点,即Logic具有映射的两个方面(实体和Dtos)。如果你想让Logic保持美观,就像@Luca建议那么你可能想要考虑将你的Dtos移动到你的WCF层(以及Profiles)。
您的Windows服务肯定已经引用了这个逻辑。
这样,可能使用此逻辑的其他项目(可能是Web应用程序)也可以使用该配置文件。