我有一个存储库层,它处理linqtosql自动生成的实体。这些最终被映射到表面上的领域友好类型中。我现在想为客户机代码提供一些更复杂的查询功能,客户机代码只知道域对象类型。
我目前有一个穷人的实现,它将客户机的映射能力限制为简单的属性,但我希望将其打开一点,以实现更复杂的查询。我不确定如何使用AutoMapper或任何其他现有的映射工具来实现这一点,也不确定如何使用自制代码来实现这一点。
以下是我想要的功能:
// Example types to be interconverted...
// DomainId should map to DataEntityId and vice versa
// DomainName should map to DataEntityName and vice versa
public class DomainType
{
public int DomainId { get; set; }
public string DomainName { get; set; }
}
public class DataEntityType
{
public int DataEntityId { get; set; }
public string DataEntityName { get; set; }
}
// And this basic framework for a query object.
public class Query<T>
{
public Query(Func<T, bool> expression) { ... }
public Func<T, bool> Query { get; }
}
// And a mapper with knowledge about the interconverted query types
public class QueryMapper<TSource, TDestination>
{
public void SupplySomeMappingInstructions(
Func<TSource, object> source, Func<TDestination, object> dest);
public Query<TDestination> Map(Query<TSource> query);
}
// And a repository that receives query objects
public class Repository<T>
{
public IQueryable<T> GetForQuery(Query<T> query) { ... }
}
最终目标是让这样的东西发挥作用:
// a repository that is tied to the LINQ-to-SQL types.
var repository = new Repository<DataEntityType>(...);
// a query object that describes which domain objects it wants to retrieve
var domain_query = new Query<DomainType>(item => item.DomainId == 1);
// some mapping component that knows how to interconvert query types
var query_mapper = new QueryMapper<DomainType, DataEntityType>();
query_mapper.SupplySomeMappingInstructions(
domain => domain.DomainId, data => data.DataEntityId);
query_mapper.SupplySomeMappingInstructions(
domain => domain.DomainName, data => data.DataEntityName);
IQueryable<DataEntityType> results =
repository.GetForQuery(query_mapper.Map(domain_query));
我想我的问题是:
-
创建这样一个映射器是否可行,如果是的话。。。
-
用AutoMapper这样的工具是否可行,如果是的话。。。
-
有没有可能利用AutoMapper映射,我已经有了这种相互转换
DomainType
和
DataEntityType
或者我需要显式映射吗
Query<DomainType>
到
Query<DataEntityType>
?
我最终想要这样做是为了能够灵活地使用不一定是简单对象属性的任意映射函数。