【发布时间】:2012-06-09 13:02:21
【问题描述】:
目前我面临的问题是,我尝试为我的 .NET 应用程序设计一个 DAL,该应用程序稍后将使用某种 NoSQL 数据库。
我现在评估的 NoSQL 数据库有时在用作主键的类型上有所不同。例如,MongoDB 使用专有的ObjectID,而 RavenDB 使用通用的string。
所以我的问题是,我如何设计这样一个可以处理不同类型的域模型 id 的 DAL。
我的第一个方法是制作通用领域模型。 这看起来像这样:
// Domain Model
public class Filter<TId> {
public TId Id { get; set; }
// ...
}
// DAO-interface
public interface IFilterDao<TId> {
bool Persist(Filter<TId>);
// ...
}
// This is where the problems begin
public static class DAOFactory {
public static IFilterDAO<T> GetFilterDAO<T>() {
// Implementation of IFilterDAO<T> can't be instantiated because types must be known at compile time
}
}
DAO-Factory方法中的注释已经描述了问题:我不能在运行时定义T,因为对应的代码是在编译时生成的。
我的第二种和第三种方法是将Id 定义为object 或dynamic。 RavenDB 无法使用object,因为它需要一个字符串。使用 dynamic 我无法将 lambdas 传递给 RavenDB API(发生编译器错误“表达式树可能不包含动态操作”)。
构建表达式树而不是使用 lambda 确实是最后的出路,因为它更耗时。
所以我完全陷入困境,我希望有人可以帮助我。 提前致谢。
更新:我终于让 RavenDB 与 object 一起工作,但使用 object 并不是一个令人满意的解决方案。
【问题讨论】: