gpt4 book ai didi

.net - 使用通用领域模型的 DAL 架构

转载 作者:行者123 更新时间:2023-12-02 02:15:30 27 4
gpt4 key购买 nike

目前我面临的问题是,我尝试为我的 .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 定义为 objectdynamic。 RavenDB 无法使用object,因为它需要一个字符串。使用 dynamic 我无法将 lambda 传递给 RavenDB API(出现编译器错误“表达式树可能不包含动态操作”)。构建表达式树而不是使用 lambda 确实是最后的出路,因为它更耗时。

所以我完全被困住了,我希望有人能帮助我。提前致谢。

更新:我终于让 RavenDB 可以使用 object,但是使用 object 并不是一个令人满意的解决方案。

最佳答案

如果在编译时知道类型,就可以解决静态类中的问题,对吗?这意味着,您必然需要为每个底层数据库实现一个 DaoFactory。

答案是你不应该使用 factory pattern - 相反,您应该使用 abstract factory pattern .

public class Filter<TId> { 
public TId Id { get; set; }
}

public interface IFilterDao<TId> {
bool Persist(Filter<TId>);
}

// Note: Can't be static since polymorphism requires an instance!
public abstract class DaoFactory<TId> {
public abstract IFilterDao<TId> GetFilterDao<TId>();
}

public sealed class MongoDBDaoFactory : DaoFactory<ObjectID> {
public override IFilterDao<ObjectID> GetFilterDao<ObjectID>() { /* ... */ }
}

public sealed class RavenDBDaoFactory : DaoFactory<String> {
public override IFilterDao<String> GetFilterDao<String>() { /* ... */ }
}

我不得不做类似的事情并尝试使用 dependency injection pattern用于选择在运行时使用的适当实现,但由于泛型问题,这实际上很难做到。 抽象工厂 是实现这一目标的最佳方式。

关于.net - 使用通用领域模型的 DAL 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10898536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com