我正在使用asp.net core 2.0。我的解决方案中有DataAccess项目和20 API服务项目。而且这个数字每天都在增加。我将使用AutoMapper。但是我不想为所有项目从NuGet添加自动映射器。因此,我想添加到唯一的DataAccess解决方案并将配置文件添加到DataAccess解决方案。我想通过编写“ mapper.Map(originalObject)”从API项目中调用。我们可以通过添加startup.cs将Automapper添加到API项目中。但是我的DataAccess项目是一个类库。因此它没有startup.cs。我该怎么办?我可以从服务项目访问automapper吗? (我不想将自动映射器从NuGet添加到API)
答案 0 :(得分:1)
可能有很多解决此问题的方法,我建议其中只有两个,并且这些方法也可能会根据您的选择和方案而改变。无论您的帮助器类是否知道将要映射的所有类型,还是其他用户库需要注册自己的POCO类,是否更喜欢创建映射器……您可能还希望缓存映射器,并在再次请求时返回它。>
简单的代码示例如下
class Foo
{
public string Name { get; set; }
}
class Bar
{
public string Name { get; set; }
}
static void Main(string[] args)
{
//First approach usage
Bar _bar1 = MapperHelper.MapFrom<Bar>(new Foo() { Name = "bbbbb" });
//Second approach usage
IMyMapper _myMapper = MapperHelper.GetMapperFor<Foo, Bar>();
Bar _bar2 = _myMapper.MapFrom<Bar>(new Foo() { Name = "aaaAAA" });
//Third approach usage
Bar _bar3 = MapperHelper.Map<Bar, Foo>(new Foo() { Name = "cccc" });
}
public interface IMyMapper
{
T MapFrom<T>(object entity);
}
class MyMapper : IMyMapper
{
IMapper mapper;
public MyMapper(IMapper mapper)
{
this.mapper = mapper;
}
public T MapFrom<T>(object entity)
{
return mapper.Map<T>(entity);
}
}
public static class MapperHelper
{
static IMapper staticMapper;
static MapperHelper()
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Foo, Bar>();
});
staticMapper = config.CreateMapper();
}
//First approach, create a mapper and use it from a static method
public static T MapFrom<T>(object entity)
{
return staticMapper.Map<T>(entity);
}
//Second approach (if users need to use their own types which are not known by this project)
//Create you own mapper interface ans return it
public static IMyMapper GetMapperFor<TSource, TDestination>()
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<TSource, TDestination>();
});
var _mapper = config.CreateMapper();
return new MyMapper(_mapper);
}
//Third sample, create and use mapper inside a static helper method
//This is for mapping foreign types that this project does not
//include (e.g POCO or model types in other projects)
public static TDestination Map<TDestination, TSource>(TSource entity)
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<TSource, TDestination>();
});
var _mapper = config.CreateMapper();
return _mapper.Map<TDestination>(entity);
}
}
第一个为已知类型创建配置并使用此映射器。 第二个创建一个映射器,并在包装器类中将其返回。 第三个创建并使用映射器进行映射操作,并且仅返回被映射的对象。
大多数人不喜欢静态类和方法,因为它们会导致严格的有害依赖关系,因此无法轻松替换它们。因此,最好创建工厂或实用程序类,将它们注册到依赖项注入容器中,并在需要时将其注入。