亲爱的stackoverflow用户,
我正在开发一个包含大量模型,存储库,实体等的大型项目......
该项目遵循MVVM模式,因此也使用了一些DTO +映射器。 我决定不使用Automapper而是手动创建映射器。 现在,DTO映射的一部分对我来说似乎很混乱,那就是如何正确使用它。
以下是架构外观的一些示例代码。 为了能够在LINQ表达式中实际使用映射器,我首先必须调用.ToEnumerable(),然后调用.ToList()。 对我来说,这似乎是一个非常糟糕的主意,因为它会为每个查询消耗更多内存?
(下面的代码已经从我的实际代码中修改,以摆脱不相关的代码)
示例代码:(在getter中,我认为我做错了)
composer update
TestMapper.cs
public class TestClass
{
private readonly IGenericRepository<TestDbConext, int, Test> _testRepository;
private readonly TestMapper _testMapper;
public List<Test> TestList
{
get
{
return _testRepository.Entities.ToEnumerable().Selext(x => _testMapper.MapFromDataModel(x)).ToList();
}
}
}
IGenericRepository.cs
public class TestMapper : IModelMapper<TestDto, Test>
{
public TestDto MapFromDataModel(Test dataModel)
{
return MapFromDataModel(dataModel, new TestDto());
}
public TestDto MapFromDataModel(Test dataModel, TestDto viewModel)
{
viewModel.Id = dataModel.Id;
viewModel.Description = dataModel.Description;
return viewModel;
}
public Test MapFromViewModel(TestDto viewModel)
{
throw new System.NotImplementedException();
}
public Test MapFromViewModel(TestDto viewModel, Test dataModel)
{
throw new System.NotImplementedException();
}
}
GenericRepository.cs
public interface IGenericRepository<TContext, in TKey, TEntity>
where TEntity : class
{
IQueryable<TEntity> Entities { get; }
TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate);
TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate);
IQueryable<TEntity> Where(Expression<Func<TEntity, bool>> predicate);
}
答案 0 :(得分:1)
你不能做任何其他事情。如果需要转换从数据库中恢复的实体,并将其映射到DTO类,则需要实现原始实体以将其映射到DTO实例。
但是当你离开AutoMapper时你做了一个糟糕的选择。 AutoMapper有一个非常有趣的扩展用于EF,Queryable Extensions。使用映射器,您必须从数据库中恢复完整实体,即从所有列中获取值,以仅映射您需要的值。此扩展只需要带来所需的列。我建议你使用AutoMapper,除非你有充分的理由不这样做。